(Далее вещи - это вещи, которые больше не применяются к C ++ 11, но применимы к C ++ 03. C ++ 11 больше не делает почти никаких различий (если они есть, то это просто язык Различия адвоката, которые я не могу вспомнить).).
Безымянные пространства имен - это утилита, позволяющая сделать единицу перевода идентификатора локальной. Они ведут себя так, как если бы вы выбрали уникальное имя для каждой единицы перевода для пространства имен:
namespace unique { /* empty */ }
using namespace unique;
namespace unique { /* namespace body. stuff in here */ }
Дополнительный шаг с использованием пустого тела важен, поэтому вы уже можете ссылаться в теле пространства имен на идентификаторы, подобные ::name
, которые определены в этом пространстве имен, поскольку директива using уже имела место.
Это означает, что вы можете иметь бесплатные функции (например) help
, которые могут существовать в нескольких единицах перевода, и они не будут конфликтовать во время соединения. Эффект почти идентичен использованию ключевого слова static
, используемого в C, которое вы можете вставить в объявление идентификаторов. Неназванные пространства имен - превосходная альтернатива, позволяющая даже сделать единицу перевода типа локальной.
namespace { int a1; }
static int a2;
Оба a
являются локальными единицами перевода и не будут конфликтовать во время ссылки. Но разница в том, что a1
в анонимном пространстве имен получает уникальное имя.
Прочитайте отличную статью на comeau-computing Почему вместо статического используется безымянное пространство имен? ( Зеркало Archive.org ).