В предыдущем видео мы с вами познакомились с пространствами имен и смогли с их помощью избежать пересечения имен классов и функций в двух разных библиотеках. В этом видео давайте подробнее рассмотрим синтаксис, который применяется при работе с пространствами имен, чтобы вы могли самостоятельно ими пользоваться, создавать свои пространства имен и применять их в своих программах. Давайте начнем с простейшего вопроса. Собственно, как создать свое пространство имен? Мы это уже сделали в предыдущем примере, и все довольно просто. Мы пишем ключевое слово namespace и за ним указываем имя, имя этого пространства имен. А дальше в фигурных скобках, собственно, в блоке кода, мы перечисляем содержимое этого пространства имен: вот как у нас на экране приведена библиотека Json, и в пространстве имен Json перечислены классы Node, Document и функция Load. При этом, обратите внимание, что мы сейчас представили объявление, мы объявили классы Node и Document (для простоты и краткости я скрыл их тела), и объявлена у нас здесь функция Load. Давайте теперь рассмотрим, как же определять, как же создавать определение, реализацию элементов пространства имен. Здесь есть два варианта синтаксиса. Первый мы применяли в нашем предыдущем видео. Собственно, мы пишем имя нашего пространства имен namespace, и дальше в фигурных скобках мы в данном случае реализуем функцию Load. Но есть и другой вариант: это не оборачивать реализацию в пространстве имен, а просто указать полные имена используемых объектов. Вот так у нас ниже приведена реализация функции Load, где мы указываем полное имя класса Document через пространство имен и полное имя функции. Давайте мы этот второй вариант сейчас применим в нашем проекте. Возьмем реализацию функции Load в пространстве имен Xml и вынесем ее в самый конец файла за границы пространства имен Json. Вставим ее, запустим компиляцию и увидим, что у нас не компилируется, потому что компилятор не знает, что такое Document. Здесь мы укажем полные имена используемых классов и функций. Скомпилируем, и у нас компилируется, то есть вот этот второй вариант создания реализации, он, как видите, работает. Но при этом, я думаю, вам очевиден недостаток такого синтаксиса. Смотрите, в этих двух строчках мы написали Xml и два двоеточия четыре раза. Такой способ часто приводит к загромождению кода, поэтому лично я в своей практике предпочитаю использовать первый способ создания определений элементов пространства имен. Хорошо, теперь давайте отметим важную вещь: пространства имен расширяемы, то есть мы можем в разных файлах объявлять одно и то же пространство имен, и все, что мы в этих разных файлах туда поместим, оно все попадет в это пространство имен. Давайте опять же продемонстрируем это в нашем проекте. Например, опять же, возьмем пространство имен Xml, и вот здесь у нас есть функция Load. Сделаем мы вот что. Мы создадим новый заголовочный файл. Давайте назовем его xml_load.h, а в нем мы подключим файл xml.h, объявим пространство имен Xml и перенесем функцию Load в этот файл. При этом реализацию мы оставим в xml.ccp. Только чтобы компилятор знал, какую функцию мы реализуем, мы здесь тоже подключим наш xml_load.h. В главной программе мы тоже подключим xml_load.h. Запустим компиляцию. Компилируется наш проект, и компиляция прошла успешно. Смотрите, что мы сделали: у нас теперь есть два заголовочных файла, файл xml.h и xml_load.h, и в обоих этих файлах у нас наполняется пространство имен Xml. Тем самым мы продемонстрировали расширяемость пространств имен. Теперь давайте поговорим об обращении к элементам пространств имен. Опять же, в предыдущем видео мы показывали, что для того чтобы обратиться к элементу пространства имен какого-то конкретного, нужно написать имя этого пространства имен, два двоеточия и, собственно, имя класса или функции. Так вот, это нужно делать, когда мы обращаемся снаружи, то есть мы, например, в функции main пишем какой-то код и обращаемся к элементам библиотеки Xml. Если же мы обращаемся изнутри пространства имен, вот как у меня в примере в реализации функции Load, — у нас функция Load реализована внутри пространства имен Xml, поэтому мы можем просто писать Document, можем просто вызывать функцию LoadNode, которая также находится в этом пространстве имен, — нам не обязательно указывать полное имя, потому что компилятор будет искать это имя, в данном случае Document, в первую очередь внутри пространства имен. Если же мы обращаемся снаружи к каким-то элементам, то нужно указывать полное имя, потому что без него компилятор не будет заглядывать в те пространства имен, которые есть в вашей программе. Итак, давайте подведем итоги. В этом видео мы с вами более подробно прошлись по синтаксису работы с пространствами имен, и теперь, я уверен, вы сможете применять их в своих многофайловых проектах.