множественное определение и пространство имен


Является ли это правильным способом иметь функции в пространстве имен, которые я буду #включать в несколько файлов?

Тест.h

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

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

3 ответа:

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

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

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

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

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

Ура и ХТ.,

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

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

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