(В следующем вещами является материал, который больше не применяется к C++ 11, но действительно относился к C++ 03. C++ 11 больше не имеет почти значений (если существует, они - просто адвокат языка различия, которые я не могу вспомнить).).
пространства имен Без имени являются утилитой для создания единицы перевода идентификатора локальной. Они ведут себя, как будто Вы выбрали бы уникальное имя на единицу перевода для пространства имен:
namespace unique { /* empty */ }
using namespace unique;
namespace unique { /* namespace body. stuff in here */ }
дополнительный шаг с помощью пустого тела важен, таким образом, можно уже обратиться в теле пространства имен к идентификаторам как ::name
, которые определяются в том пространстве имен, так как директива использования уже произошла.
Это означает, что можно было назвать бесплатные функции (например) help
, который может существовать в нескольких единицах перевода, и они не столкнутся во время ссылки. Эффект почти идентичен использованию static
ключевое слово, используемое в C, который можно вставить в объявлении идентификаторов. Пространства имен без имени являются превосходящей альтернативой, способность даже сделать единицу перевода типа локальной.
namespace { int a1; }
static int a2;
И a
локальная единица перевода и не столкнется во время ссылки. Но различие - то, что a1
в анонимном пространстве имен получает уникальное имя.
Read превосходная статья при comeau-вычислении , Почему пространство имен без имени используется вместо помех? ( зеркало Archive.org ).
Наличие чего-то в анонимном пространстве имен означает, что это локально для этого единица перевода (.cpp файл, и все включают), это означает, что, если другой символ с тем же именем определяется в другом месте, не будет нарушения Одно Правило Определения (ODR).
Это совпадает со способом C наличия статической глобальной переменной или статической функции, но это может использоваться для определений классов также (и должен использоваться, а не static
в C++).
Все анонимные пространства имен в том же файле рассматривают как то же пространство имен, и все анонимные пространства имен в различных файлах отличны. Анонимное пространство имен является эквивалентом:
namespace __unique_compiler_generated_identifer0x42 {
...
}
using namespace __unique_compiler_generated_identifer0x42;
Анонимное пространство имен делает вложенные переменные, функции, классы, и т.д. доступные только в том файле. В Вашем примере это - способ избежать глобальных переменных. Нет никакого различия в производительности или времени компиляции во время выполнения.
нет так преимущества или недостатка кроме, "я хочу, чтобы эта переменная, функция, класс, и т.д. были общедоступными или частными?"
Пример показывает, что люди в проекте, к которому вы присоединились, не понимают анонимные пространства имен:)
namespace {
const int SIZE_OF_ARRAY_X;
const int SIZE_OF_ARRAY_Y;
Они не должны находиться в анонимном пространстве имен, поскольку const
объект уже имеет статическую связь и, следовательно, не может конфликтовать с идентификаторами того же имени в другой единице перевода.
bool getState(userType*,otherUserType*);
}
И это на самом деле пессимизация: getState ()
имеет внешнюю связь. Обычно лучше предпочесть статическую привязку, так как это не загрязняет таблицу символов. Здесь лучше написать
static bool getState(/*...*/);
. Я попал в ту же ловушку (в стандарте есть формулировка, предполагающая, что статика файлов почему-то устарела в пользу анонимных пространств имен), но работая в большом проекте C ++, таком как KDE, вы получаете множество людей, которые поворачивают вашу голову в правильном направлении снова вокруг :)