2013-11-01 259 views
-1

我试着这样做:使用匿名。匿名的名称空间函数。命名空间范围

file.h

namespace { 
    void fun(); 
    const bool nevermind = Register(fun); 
} 

file.cpp

namespace { 
    void fun() { 
     do_some_job(); 
    } 
} 

有链接错误。函数void fun()不是由链接器找到的。

如果我试着这样做:

file.h

namespace { 
    void fun() { 
     do_some_job(); 
    } 
    const bool nevermind = Register(fun); 
} 

一切都OK。

如何编译第一种情况?我不想在* .h文件中定义函数。

回答

2

匿名命名空间的目的是阻止您在其他任何地方使用该功能。因此,在标题中定义它几乎没有意义。我会假设每当你添加一个匿名名称空间时,编译器实际上将它视为一个具有乱码唯一名称的名称空间。所以当你添加另一个匿名名字空间时,它不是同一个名字空间。

另请参阅下面BoBTFish的评论,澄清这一点。

+1

不完全。同一翻译单元中的两个未命名的名称空间或多或少具有相同的名称,这与其他翻译单元是唯一的。所以你可以在'.cpp'文件顶部的一个未命名的命名空间中声明一个声明,并且在另一个声明的底部定义一个声明,它们将会匹配,但不会跨越两个文件。 – BoBTFish

+0

@BoBTFish:好的,这很有道理。感谢您纠正我! – villintehaspam