анонимное пространство имен - PullRequest
23 голосов
/ 29 июля 2010

Чем отличаются эти два файла?

cpp-файл:

namespace
{
    int var;
}

или

int var;

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

Ответы [ 5 ]

29 голосов
/ 29 июля 2010

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

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

4 голосов
/ 29 июля 2010

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

extern int var;
var = 42;

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

3 голосов
/ 29 июля 2010

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

extern int var;

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

2 голосов
/ 29 июля 2010

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

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

1 голос
/ 29 июля 2010

Два очка:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...