В первом примере main2.cpp
определяет глобальную переменную i
, к которой может получить доступ main.cpp
, если в этом файле появится extern
объявление i
. (Обычно это объявление extern исходит из файла заголовка.) Вы получили ошибку компилятора, потому что i
никогда не объявлялось в main.cpp
, что означает, что компилятор предполагает, что такой переменной нет.
Во втором примере main2.cpp
определяет переменную области файла i
. Переменные области файла отличаются от глобальных переменных, даже если они имеют одно и то же имя. Если бы у вас было внешнее объявление i
в main.cpp
во втором примере, оба файла были бы успешно скомпилированы, но тогда вы получили бы ошибку ссылки, потому что нет глобальной переменной i
был определен.
Если вы переименуете main2.cpp
из второго примера в main3.cpp
, добавите внешнее объявление i
в main.cpp
, скомпилируете все три и соедините их все вместе, это будет успешным; main.cpp и main2.cpp будут использовать одну переменную с именем i
, а main3.cpp
будет иметь собственную совершенно отдельную переменную с именем i
.
Этот материал называется linkage. Пространства имен почти полностью не связаны с компоновкой. Однако анонимное пространство имен является особенным. Определение переменной в анонимном пространстве имен для всех практических целей аналогично ее определению с помощью static
— оно делает ее переменной области действия файла. (Если я правильно помню, разница есть, но она имеет значение только в том случае, если вы делаете сложные вещи с экспортированными шаблонами, а поскольку экспортированные шаблоны используются настолько мало, что говорят об удалении функции из стандарта C++, вы не не стоит об этом беспокоиться.)
Ценность анонимного пространства имен заключается в том, что вы можете поместить в него определение класса, что делает все методы класса локальными для файла. (Только блок class { ... }
должен быть внутри блока namespace { ... }
, чтобы получить этот эффект.) Вы не можете сделать это другим способом.
person
zwol
schedule
07.09.2010
namespace { }
. - person Potatoswatter   schedule 07.09.2010