【问题标题】:multiple definition and namespace多重定义和命名空间
【发布时间】:2011-01-28 11:16:20
【问题描述】:
这是在命名空间中拥有我将#include 包含在多个文件中的函数的正确方法吗?
测试.h
#pragma once
#ifndef TEST
#define TEST
namespace test{
namespace {
bool test(){
return true;
}
}
}
#endif //TEST
【问题讨论】:
标签:
c++
namespaces
pragma
include-guards
【解决方案1】:
包含保护名称TEST 可能与其他宏冲突,请使用更详细的名称,例如HEADERNAME_H。
注意:以下划线后跟大写的名称,以及包含两个连续下划线的名称,保留用于实现。
其次,如果你要把它放在头文件中,那么函数定义需要是inline。否则,当包含在多个翻译单元中时,您将收到多定义链接器错误。或者更正式地说,标准的 ODR(一个定义规则)禁止这样的多个定义,除非它们都是 inline 并且实际上是相同的。
编辑:删除上面的内容,因为我没有看到您使用了匿名命名空间。
而不是匿名命名空间,它在每个翻译单元中为您提供一个单独的命名空间,并在每个这样的命名空间中提供一个单独的(相同的)函数定义,而不是只使用 inline - 如上面删除的文本中所述。
干杯,
【解决方案2】:
匿名命名空间使它们包装的所有标识符对它们所在的翻译单元来说是唯一的。将匿名命名空间放入将(迟早)包含在不同的翻译单元将导致该匿名命名空间中定义的所有标识符分别(但相同)在每个翻译单元中。
我还没有看到一个需要这个的用例。
【解决方案3】:
是的。因为它使您能够以相同的名称命名相同的事物并保持名称简单