Анонимное пространство имен
В чем разница между этими двумя?
CPP файл:
namespace
{
int var;
}
или
int var;
если оба они помещены в файл cpp? Неправильно ли мы помещаем переменную в анонимное пространство имен, чтобы она могла быть приватной только для этого файла? Но если мы помещаем глобальную переменную в файл cpp, это не та переменная, которая также является приватной, потому что вы никогда не добавляете в файл .cpp?
Ответы
Ответ 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
, у вас будет несколько определений этой переменной.
Как указано в стандарте:
[...] все вхождения единственного в единицы перевода заменяются тот же идентификатор и этот идентификатор отличается от всех других идентификаторов в всей программы.