множественное определение и пространство имен
Является ли это правильным способом иметь функции в пространстве имен, которые я буду #включать в несколько файлов?
Тест.h
#pragma once
#ifndef TEST
#define TEST
namespace test{
namespace {
bool test(){
return true;
}
}
}
#endif //TEST
3 ответа:
Имя include guard
TEST
, вероятно, конфликтует с каким-то другим макросом, используйте что-то более сложное, напримерHEADERNAME_H
.Примечание: имена, начинающиеся с подчеркивания, за которым следует верхний регистр, и имена, содержащие два последовательных подчеркивания, зарезервированы для реализации.
во-вторых, если вы собираетесь поместить это в заголовочный файл, то определение функции должно бытьinline
. В противном случае при включении в несколько единиц перевода вы получите несколько определений ошибка компоновщика. Или более формально, стандарт ODR (One Definition Rule) запрещает такие множественные определения, если они всеinline
и фактически идентичны.Edit : удалить выше, потому что я не видел, как вы используете анонимное пространство имен .
Вместо анонимного пространства имен, которое дает вам отдельное пространство имен в каждой единице перевода и отдельное (идентичное) определение функции в каждом таком пространстве имен, вместо этого просто используйте
inline
- как объяснено в зачеркнутом тексте выше.Ура и ХТ.,
Анонимные пространства имен делают все идентификаторы, которые они обертывают уникальный для переводческой единицы они уже внутри. Помещение анонимного пространства имен в заголовок, который будет (рано или поздно) включен в различные единицы перевода, приведет к тому, что все идентификаторы, определенные в этом анонимном пространстве имен, будут отдельно (но идентично) в каждой переводческой единице.
Я еще не видел случая использования,когда это нужно.