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