2010-07-29 2 views
23

В чем разница между этими двумя?анонимное пространство имен

CPP-файл:

namespace 
{ 
    int var; 
} 

или

int var; 

если оба помещаются в файл CPP? Неправильно ли мы помещаем переменную в анонимное пространство имен, чтобы она могла быть приватной только для этого файла? Но если мы помещаем глобальную переменную в файл cpp, это не та переменная, которая также является приватной, потому что вы никогда не добавляете в файл .cpp?

ответ

29

В вашем втором случае, когда вы не используете анонимное пространство имен, если какой-либо другой файл cpp объявляет extern int var;, он сможет использовать вашу переменную.

Если вы используете анонимное пространство имен, то при времени ссылки другой файл cpp генерирует неопределенную опорную ошибку.

+2

Так что, я думаю, вы можете получить тот же результат, установив переменную как статическую. – Dacav

+0

Правда.Также в C++, определяя его как const, что будет означать статичность. –

+1

@ Dacav: Верно. но способ C++ это использовать анонимное пространство имен. Использование static - это результат обратной совместимости C++ с C. –

3

Вторая версия определена в глобальном пространстве имен - другие файлы .cpp могут добраться до него, объявив

extern int var;

и даже если они не делают этого, если кто-то использует тот же имя в глобальном пространстве имен, вы получите сообщение об ошибке (многократно определенный символ).

4

Во втором случае, когда другие .cpp файлы могут получить доступ к переменной как:

extern int var; 
var = 42; 

и компоновщик найдет. В первом случае имя переменной искажается вне всякой причины :), поэтому вышеизложенное невозможно.

2

В дополнение к причине, заданной Николаем и другими, если вы не используете анонимное пространство имен, вы можете получить конфликты именования с другими глобальными данными. Если вы используете анонимное пространство имен, вместо этого вы будете скрывать глобальные данные.

От cprogramming.com: «В пространстве имен вы уверены, что глобальные имена не будут конфликтовать, потому что имена функций каждого пространства имен имеют приоритет над именами внешних функций».

1

Две точки:

  1. кто использует extern int var; может получить доступ к переменной, если это не в безымянном пространстве имен.
  2. Если в другом файле у вас есть другая глобальная переменная int var, у вас будет несколько определений этой переменной.

Как указано в стандарте:

[...] все вхождения в уникальный блок в перевода заменяются же идентификатором и этот идентификатор отличается от всех других идентификаторов в всей программы.