Почему пространства имен без имени используются и каковы их преимущества?

220
задан James McNellis 8 August 2010 в 15:41
поделиться

4 ответа

(В следующем вещами является материал, который больше не применяется к 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 ).

174
ответ дан IceFire 23 November 2019 в 04:08
поделиться

Наличие чего-то в анонимном пространстве имен означает, что это локально для этого единица перевода (.cpp файл, и все включают), это означает, что, если другой символ с тем же именем определяется в другом месте, не будет нарушения Одно Правило Определения (ODR).

Это совпадает со способом C наличия статической глобальной переменной или статической функции, но это может использоваться для определений классов также (и должен использоваться, а не static в C++).

Все анонимные пространства имен в том же файле рассматривают как то же пространство имен, и все анонимные пространства имен в различных файлах отличны. Анонимное пространство имен является эквивалентом:

namespace __unique_compiler_generated_identifer0x42 {
    ...
}
using namespace __unique_compiler_generated_identifer0x42;
64
ответ дан N0thing 23 November 2019 в 04:08
поделиться

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

нет так преимущества или недостатка кроме, "я хочу, чтобы эта переменная, функция, класс, и т.д. были общедоступными или частными?"

11
ответ дан Max Lybbert 23 November 2019 в 04:08
поделиться

Пример показывает, что люди в проекте, к которому вы присоединились, не понимают анонимные пространства имен:)

namespace {
    const int SIZE_OF_ARRAY_X;
    const int SIZE_OF_ARRAY_Y;

Они не должны находиться в анонимном пространстве имен, поскольку const объект уже имеет статическую связь и, следовательно, не может конфликтовать с идентификаторами того же имени в другой единице перевода.

    bool getState(userType*,otherUserType*);
}

И это на самом деле пессимизация: getState () имеет внешнюю связь. Обычно лучше предпочесть статическую привязку, так как это не загрязняет таблицу символов. Здесь лучше написать

static bool getState(/*...*/);

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

12
ответ дан 23 November 2019 в 04:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: