如果您希望某些非成員函數只能被相同翻譯單元中的函數調用,那麼可以不在頭中定義它們嗎?好的不在頭中包含一些非成員函數嗎?
回答
這很常見。使頭文件保持凌亂。通常情況下,您可以將它們放在.cpp文件中的匿名名稱空間中。
您可以使用static關鍵字在沒有匿名命名空間的情況下完成此操作。
它在C++ 11中不贊成。 –
@LightnessRacesinOrbit - 感謝您的澄清。我沒有意識到這一點。上面更正了它。 –
np;你_did_說「我相信」! –
是的,非會員功能可以放置在翻譯單元內。
聲明並將它們定義爲static
,因此它們是專用在翻譯單元內。
可以在頭文件中聲明它們。但是,如果您在標題中定義它們,並且標題包含多個編譯單元,則會導致鏈接錯誤衝突。
見這個例子:
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
[~]$
此外,靜態作品的作爲上述職位說。
_「衝突的鏈接錯誤」_介意如果我偷了這個? –
@LightnessRacesinOrbit,因爲它編譯在兩個翻譯單元中。他們都有一段二進制。當你將它們連接在一起時,程序不知道要使用哪一個。 – BigTailWolf
我想你誤解了我的意見。我沒有要求解釋;我問我是否可以竊取這句話!這是一個美妙的短語,我想在別處寫作時使用它。 –
您可以將函數放在它們自己的名稱空間中,這樣它就不會影響其他代碼。通常的做法是使命名空間成爲主庫命名空間的內部命名空間,並將其稱爲細節或類似的東西。
當然,如果您需要通過ADL(依賴於參數的查找)來使用函數,那麼它必須位於包含ADL應該匹配的類的命名空間中。這是沒有辦法的。
- 1. 我們可以在C++中的結構中包含成員函數嗎?
- 2. 在頭文件中隱藏非成員函數
- 3. 正在從析構函數調用非成員函數嗎?
- 4. 包的一些成員不可見 - Pycharm
- 5. 「自動」爲C++成員函數創建非成員包裝
- 6. 在非成員函數聲明的開頭有什麼影響?
- 7. 可以在頭文件中定義一個非常長的類函數成員?
- 8. 在非類成員函數的參數中傳遞類成員函數
- 9. 在文件開頭包含函數列表的好習慣
- 10. C++從非成員函數
- 11. 成員函數非對象
- 12. 非成員函數模板
- 13. 非靜態成員函數
- 14. 將非會員非朋友函數加入到成員函數
- 15. Effective C++項目23首選成員函數的非成員非朋友函數
- 16. 在D中覆蓋'包'成員函數
- 17. 從const成員函數調用非const成員函數
- 18. 運算符重載:成員函數與非成員函數?
- 19. 調用從const成員函數非const成員函數指針
- 20. 封裝一個包含char *成員的非託管結構
- 21. 將所有包含放在一個頭文件中是一個好主意嗎?
- 22. 獲得來自頭文件數據到非成員函數
- 23. Doxygen可以在成員組中包含一個函數,但不能記錄它嗎?
- 24. 成員函數指針,傳遞函數作爲非成員函數的參數
- 25. 一個類的非靜態成員函數的函數指針
- 26. C程序找不到包含在頭文件中的函數
- 27. 我可以在C++中聲明一個非成員函數const嗎?
- 28. 作爲成員函數和非成員函數的運算符函數
- 29. 呼叫成員函數在非對象
- 30. 調用一個成員函數bind()的一個非對象在
是的,將它們定義爲'static'並將聲明放在源文件(翻譯單元)的頂部。 –