Пространство имен. Ключевое слово 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).

Условная компиляция позволяет выбрать код для компиляции в зависимости от:

·модели процессора (платформы);

·разрядности адресов;

·размерности типов;

·наличия/отсутствия поддержки расширений языка;

·наличия/отсутствия библиотек и/или функций;

·особенностей поведения конкретных функций;

·и другого.

Наши рекомендации