Имена, определенные на самом верхнем уровне, вне всех пространств имен, входят в глобальное пространство имен (см. п. п. 3.3.5/3 в [1]). Оно, естественно, не имеет имени и является единственным. Некоторые имена из именованных пространств могут совпадать с глобальными. Чтобы обратиться именно к глобальному имени, нужно использовать операцию разрешения контекста (::), так как по умолчанию (без указания квалификаторов) всегда выбирается имя с наименьшей областью видимости. Например, имена всех API-функций Windows входят в это глобальное пространство имен, поэтому лучше их указывать только таким способом:
int z = ::max(5,6): // вызывается нестандартная функция С++
Для локализации имени в файле вместо атрибута static в С++ разрешается задавать анонимные (неименованные) пространства имен. Анонимные пространства имен являются локальными пространствами для единицы трансляции. Для каждого анонимного пространства компилятор генерирует уникальное «внутреннее» имя, поэтому анонимные пространства имен не «склеиваются». В справочной системе интегрированной среды Borland С++ Builder 6 приводится простой пример, который здесь немного модифицирован (листинг 13.20).
Листинг 13.20. Локальное пространство имен
// модуль ml.срр #include<iostream> void func(void): // функция в этом модуле не определена
namespace // анонимное пространство имен { double pi = 3.1415926: // это имя pi доступно только в этом файле
^ продолжение &
Листинг 13.20 {продолжение) int main() {//double pi = 0.1; //1: локальное опредепение того же имени
std::cout << "pi = " << pi << std::endl; func(); return 0; } //-- - - -// модуль m2.cpp #include<iostream>
namespace // анонимное пространство { float pi = 10.0001F; // имя pi доступно топько в этом файле void f(void) // определение локальной функции { std::cout << "First func() called; pi = " << pi<<std::endl; } } void func(void) // определение глобальной функции { f(); // вызов локальной функции
std::cout << "Second func() called; pi = " << pi; }
Эта программа выводит на экран следующее:
pi = 3.14159
First func() called; pi = 10.0001 Second func() called; pi = 10.0001
В модуле ml.cpp определено локальное пространство имен, в котором задана константа pi. В функции main() строка 1 закомментирована, поэтому выводится значение pi из локального пространства имен. Если же комментарий удалить, то в операторе вывода будет использоваться имя с более ограниченной областью видимости (имя pi в теле главной функции). В этом случае мы никаким способом не сможем добраться до имени, определенного в локальном пространстве имен, — префикса-то нет!
Во втором файле т2.срр определено свое локальное пространство имен, в котором прописано то же имя pi, но задана другая константа. В том же локальном пространстве имен определена локальная функция f (). Вне локального пространства определена глобальная функция f unc (), которая вызывает локальную версию f (). В модуле ml.cpp прописан прототип глобальной функции, чтобы ее можно было вызвать в этом модуле. В файле ml.cpp невозможно использовать ни функцию f (), ни имя pi из файла т2.срр.
Резюме
Помимо логической декомпозиции, С++ позволяет физически разделить большую программу на части. Отдельный файл с исходным текстом является единицей трансляции. Объединение программ в единое целое выполняется двумя способами: исходные тексты объединяются препроцессором, а объектные модули собираются компоновщиком, который входит в состав любой интегрированной среды.
Класс обычно разделяется на две части: интерфейс, который по традиции помещается в h-файл, и реализацию, хранящуюся в сср-файле. Интерфейс класса
Опубликовал Kest
March 02 2014 19:00:24 ·
0 Комментариев ·
4297 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.