多重定义和命名空间

时间:2011-01-28 11:16:20

标签: c++ namespaces pragma include-guards

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

test.h

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

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

3 个答案:

答案 0 :(得分:8)

包含警卫名称TEST可能会与其他一些宏发生冲突,请使用更精细的内容,例如HEADERNAME_H

注意:以下划线后跟大写的名称和包含两个连续下划线的名称保留给实现。

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

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

而不是匿名命名空间,它在每个翻译单元中为您提供单独的命名空间,在每个这样的命名空间中提供单独的(相同的)函数定义,而不仅仅使用inline - 如在标记文本中所解释的那样上方。

干杯&第h。,

答案 1 :(得分:2)

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

我还没有看到一个人们想要这个的用例。

答案 2 :(得分:0)

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