множественное определение и пространство имен - PullRequest
4 голосов
/ 28 января 2011

Это правильный способ иметь функции в пространстве имен, которые я #include в нескольких файлах?

test.h

#pragma once
    #ifndef TEST
    #define TEST
    namespace test{
    namespace {

        bool test(){
            return true;
        }
    }
}
#endif //TEST

Ответы [ 3 ]

8 голосов
/ 28 января 2011

Имя включаемого охранника TEST может конфликтовать с каким-либо другим макросом, используйте что-то более сложное, например HEADERNAME_H.

Примечание: имена, начинающиеся с подчеркивания, за которыми следует верхний регистр, и имена, содержащиедва последовательных подчеркивания зарезервированы для реализации.

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

Редактировать : удалить выше, потому что яне видел, как вы используете анонимное пространство имен .

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

Приветствия & hth.,

2 голосов
/ 28 января 2011

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

Я еще не видел вариант использования, когда кто-то хочет этого.

0 голосов
/ 28 января 2011

Да. Потому что это дает вам возможность называть одни и те же вещи с одинаковыми именами и сохранять эти имена простыми

...