2013-08-29 40 views
2

TEST.CPP匿名命名空间 - 在头文件和代码文件中都有意义?

#include "test.hpp" 

void f1() { } 

namespace { 
    void f2() {} 
} 

namespace test { 
    void f3() { } 
} 

请纠正我,如果我错了,但:

  • f1可以从外部调用如果在头文件extern声明声明
  • f2不能从外部呼叫
  • 012如果在头文件中声明了可以从外部调用(并且前缀正确 - test::)。如果它没有在头文件中声明,它不能被调用?

对不起,对吗?

+0

即使你不这样做,客户端可以声明F1和F3 ... – jiggunjer

回答

3

您的问题标题有误导性。不要将匿名名称空间放在标题中。

f2不能从test.cpp外部调用,正确。

f1f3可以被调用,如果适当的声明可用。这些可以在标题中,但没有任何其他.cpp文件停止,只需将代码置于标题中即使没有提供。

另外,函数声明不需要extern

void f1(); 
namespace test { 
    void f3(); 
} 
+0

*不要把一个匿名命名空间中的标题,永远* - 为什么? –

+4

除了无用地复制到包含标题的每个cpp文件中的功能之外,它在某些情况下也会产生非常微妙的问题,例如,如果你在那个头里有一个内联函数,它不在匿名命名空间中,而是使用来自匿名命名空间的东西。有一种情况我知道在哪里做这件事是正确的,但这是非常罕见和微妙的,除非你正在编写像Boost那样的复杂头文件库,否则你不需要它。对于99.99%的C++程序员来说,“永不”是他们需要的唯一规则。 –

+0

@JoshuaMN http://stackoverflow.com/q/357564/476681 –