2013-11-01 303 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