Подтвердить что ты не робот

Анонимное пространство имен

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

CPP файл:

namespace
{
    int var;
}

или

int var;

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

extern int var;
var = 42;

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

Ответ 3

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

extern int var;

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

Ответ 4

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

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

Ответ 5

Две точки:

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

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

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