Пространство имен. Ключевое слово using как директива
Предположим, у нас есть проект, который разрабатывают несколько человек. Если у двух из них имеется глобальная переменная с одним и тем же именем, будет конфликт имен при сборке проекта. Раньше, до изобретения пространств имен, эта проблема решалась следующим образом: каждому из разработчиков назначался свой префикс, и все его имена должны были начинаться с него. Теперь каждый из разработчиков может иметь свое пространство имен, в котором содержатся все его глобальные константы и переменные, классы, функции. И если у двух из них есть переменная с одним и тем же именем, конфликта не возникает, поскольку эти переменные лежат в разных пространствах имен. Определение пространства имен выглядит следующим образом:
namespace имя
{
объявления и определения глобальных
переменных, функций и классов
}
В одном и том же файле может встречаться несколько определений одного и того же пространства имен — все они объединяются вместе. После определения пространства имен, для ссылки на любое содержащееся в нем имя, нужно поставить перед ним имя пространства имен и операцию разрешения области видимости. Например, если у нас есть пространство имен myspace и в нем функция myfunc, то для вызова этой функции в качестве имени надо написать myspace::myfunc. Если мне нужно конкретное имя из определенного пространства имен, и оно часто используется в моей части про- граммы, то, чтобы не писать имя пространства имен, можно воспользоваться конструкцией using имя_пространства_имен::нужное_имя;. После этого указанным именем можно пользоваться непосредственно, без указания пространства имен. Если мне нужны многие имена из какого-либо пространства, можно аналогичным образом импортировать это пространство имен целиком, написав using namespace имя;. Так что фраза using namespace std; означает ничто иное, как импорт всего пространства имен std. Это пространство имен содержит все имена из стандартной библиотеки языка C++. Можно не только импортировать отдельные имена или пространства имен в свою часть программы, но также и в другие пространства имен. Для этого директива using должна встречаться в теле определения того пространства имен, куда осуществляется импорт. Таким образом можно создавать новые пространства имен из уже существующих, включая в новые пространства имен нужные имена из разных пространств имен.
Каждую программу на языке С++ можно разбить на несколько так называемых пространств имен. Пространством имен называется область программы, в которой распознается определенная совокупность имен. Эти имена за пределами данного пространства имен.
Директива using namespace std; означает, что все определенные ниже имена в программе будут относиться к пространству имен с именем std. Различные элементы программы описаны с использованием пространства имен std, например переменная cout. Если не использовать директиву using, то к этим элементам программы придется каждый раз добавлять имя std:
std::cout << «У каждой эпохи свой язык»\n;
Для того что бы не дописывать std:: каждый раз перед именем переменной, используется директива using.
Процессор и имена заголовочных файлов
Заголовочный файлили подключаемый файл— в языках программирования файл, содержимое которого автоматически добавляется препроцессором в исходный текст в том месте, где располагается некоторая директива
В языках программирования Си и C++, заголовочные файлы — основной способ подключить к программе типы данных, структуры, прототипы функций, перечислимые типы, и макросы, используемые в другом модуле. Имеет по умолчанию расширение .h; иногда для заголовочных файлов языка C++ используют расширение .hpp.
Препроцессор— это компьютерная программа, принимающая данные на входе и выдающая данные, предназначенные для входа другой программы (например, компилятора). О данных на выходе препроцессораговорят, что они находятся в препроцессированной форме, пригодной для обработки последующими программами (компилятор).
Препроцессор С/С++ — программа, подготавливающая код программы на языке C/C++ к компиляции.
Препроцессором выполняются следующие действия:
·замена соответствующих диграфов и триграфов на эквивалентные символы «#» и «\»;
·удаление экранированных символов перевода строки;
·замена строчных и блочных комментариев пустыми строками (с удалением окружающих пробелов и символов табуляции);
·вставка (включение) содержимого произвольного файла (#include);
·макроподстановки (#define);
·условная компиляция (#if, #ifdef, #elif, #else, #endif);
·вывод сообщений (#warning, #error).
Условная компиляция позволяет выбрать код для компиляции в зависимости от:
·модели процессора (платформы);
·разрядности адресов;
·размерности типов;
·наличия/отсутствия поддержки расширений языка;
·наличия/отсутствия библиотек и/или функций;
·особенностей поведения конкретных функций;
·и другого.