2015-10-07 16 views

回答

4

這很常見。使頭文件保持凌亂。通常情況下,您可以將它們放在.cpp文件中的匿名名稱空間中。

您可以使用static關鍵字在沒有匿名命名空間的情況下完成此操作。

+1

它在C++ 11中不贊成。 –

+0

@LightnessRacesinOrbit - 感謝您的澄清。我沒有意識到這一點。上面更正了它。 –

+0

np;你_did_說「我相信」! –

1

是的,非會員功能可以放置在翻譯單元內。

聲明並將它們定義爲static,因此它們是專用在翻譯單元內。

0

可以在頭文件中聲明它們。但是,如果您在標題中定義它們,並且標題包含多個編譯單元,則會導致鏈接錯誤衝突。

見這個例子:

header.h

class Foo 
{ 
}; 

void f() 
{ 
} 

b.cpp

# include "header.h" 

a.cpp

# include "header.h" 

int main() 
{ 
} 

編譯OK,但鏈接錯誤:

[~]$ g++ -c a.cpp 
[~]$ g++ -c b.cpp 
[~]$ g++ -o run a.o b.o 
b.o: In function `f()': 
b.cpp:(.text+0x0): multiple definition of `f()' 
a.o:a.cpp:(.text+0x0): first defined here 
collect2: error: ld returned 1 exit status 
[~]$ 

另外,如果你單獨聲明和定義是這樣的:

header.h

class Foo 
{ 
}; 

void f(); 

b.cpp

#include "header.h" 

void f() 
{ 
} 

a.cpp

#include "header.h" 

int main() 
{ 
} 

然後它會好

[~]$ g++ -c a.cpp 
[~]$ g++ -c b.cpp 
[~]$ g++ -o run a.o b.o 
[~]$ 

此外,靜態作品的作爲上述職位說。

+0

_「衝突的鏈接錯誤」_介意如果我偷了這個? –

+0

@LightnessRacesinOrbit,因爲它編譯在兩個翻譯單元中。他們都有一段二進制。當你將它們連接在一起時,程序不知道要使用哪一個。 – BigTailWolf

+0

我想你誤解了我的意見。我沒有要求解釋;我問我是否可以竊取這句話!這是一個美妙的短語,我想在別處寫作時使用它。 –

0

您可以將函數放在它們自己的名稱空間中,這樣它就不會影響其他代碼。通常的做法是使命名空間成爲主庫命名空間的內部命名空間,並將其稱爲細節或類似的東西。

當然,如果您需要通過ADL(依賴於參數的查找)來使用函數,那麼它必須位於包含ADL應該匹配的類的命名空間中。這是沒有辦法的。

相關問題