4

这是在命名空间中拥有我将在多个文件中#include 的函数的正确方法吗?

测试.h

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

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

3 回答 3

8

包含保护名称TEST可能与其他宏冲突,请使用更复​​杂的名称,例如HEADERNAME_H.

注意:以下划线后跟大写字母开头的名称,以及包含两个连续下划线的名称,保留用于实现。

其次,如果你要将它放在头文件中,那么函数定义需要是inline. 否则,当包含在多个翻译单元中时,您将收到多定义链接器错误。或者更正式地说,该标准的 ODR(一个定义规则)禁止这样的多个定义,除非它们都inline有效地相同。

编辑:删除上面,因为我没有看到您使用匿名命名空间

而不是匿名命名空间,它在每个翻译单元中为您提供一个单独的命名空间,并在每个这样的命名空间中为您提供一个单独的(相同的)函数定义,而不是仅仅使用inline- 如上面删除的文本中所述。

干杯&hth.,

于 2011-01-28T11:23:02.963 回答
2

匿名命名空间使它们包装的所有标识符对于它们所在的翻译单元都是唯一的。将匿名命名空间放入将(迟早)包含在不同翻译单元中的标头中将导致在该匿名命名空间中定义的所有标识符都是分开的(但相同)在每个翻译单元中。

我还没有看到一个需要这个的用例。

于 2011-01-28T13:22:06.553 回答
0

是的。因为它使您能够用相同的名称命名相同的事物并保持名称简单

于 2011-01-28T11:21:12.627 回答