2012-07-09 107 views
3

有時候我遇到了這種情況,我發現我需要爲大型第三方文件創建一個#include,以便我可以使用一個函數或一個小類,這讓我感到內疚,因爲我知道這是消失增加我的編譯時間,因爲它會編譯整個文件,當我只想要一個函數。有什麼辦法可以解決這個問題,只包含我想要的一個功能,而不用重寫整個事情?C++ #include - 只有部分#include

+1

你確定你會大量增加編譯時間嗎?一個標題通常不會有太大的區別。 – templatetypedef 2012-07-09 20:22:11

回答

9

你有一些選擇:

  • 就包括頭。真的,它不會增加你的編譯時間。
  • 抱怨你的第三方頭提供商。告訴他們運送更小,更模塊化的標頭。
  • 不包括頭,但聲明爲extern您所關心的單一功能,像這樣extern int GetMeaningOfLife(int mice);
+3

你並不需要'extern'函數聲明。他們默認是'extern'。 – bames53 2012-07-09 20:31:24

+0

謝謝,那正是我一直在尋找的。 – Caesar 2012-07-09 20:44:45

4

您不能僅編譯標頭的一部分。如果該第三方的頭文件中包含大量代碼,則無法對此做任何處理。我能想到的最好的解決方案是使用precompiled headers,這應該消除一些編譯開銷,因爲這些標題只能被完全編譯一次。另一種選擇是使用類的前向聲明,而不是包含它們的聲明,如果其他翻譯單元確實包含頭部的話。儘管如此,這隻會讓你使用這些類作爲指針。

1

頭可能不會被一大因素增加你的編譯時間。這取決於它的內容。編輯出你不需要的東西當然是可能的,但我不推薦它。這很容易出錯,通常很少付出很少的回報。標題是否有include guards?如果沒有,如果編譯速度慢,你可以考慮添加它們。

2

有時候簡單地編寫自己的前向聲明而不是包含頭文件可能是合理的。雖然如果你不負責定義事情,那麼你可能遇到定義改變的問題,你必須更新你的前向聲明。

例如,一些Boost庫已經試圖在標準庫中聲明一些東西來避免#includes。最近,他們遇到了libC++實現標準庫的問題,因爲libC++使用內聯名字空間,所以天真的前向聲明不適用於libC++。事實上,一個標準的庫實現可以完成許多符合標準的不同事情,但可能會打破適用於不同實現的聲明。

因此,手動轉發聲明很脆弱,可能不可移植,但可能適用於您。

另一種選擇是使用預編譯頭文件。這可以減少包含標題所需的處理。例如,我有一個臨時項目,我將它放在標準庫中的每個標題中。沒有預編譯頭文件編譯空程序需要幾秒鐘。使用預編譯頭文件,一個空程序只需要很短的時間。

你必須看看你的編譯器如何處理預編譯頭文件。例如,當您使用-x C++ - header或-x c-header處理頭文件時,Gcc和clang會生成預編譯頭文件。然後,當你使用-include標誌來包含一個文件時,編譯器將搜索該頭文件的預編譯版本(使用編譯器特定的命名約定),並可能包含該文件。

$ 貓everything.h

#include <iostream> 

$ 貓的main.cpp

int main() { 
    std::cout << "Hello, World!\n"; 
} 

$ 鐺++ -x C++ - 頭everything.h -o everything.h .pch

$ 鐺++ main.cpp中-include everything.h

$ ./a.out

你好,世界

鏘查找.PCH而GCC查找.gch

+0

你真的用'cat'寫你的代碼嗎? – anthropomorphic 2012-07-09 20:43:41

+0

當然不是。那太荒謬了。我用[ed](http://en.wikipedia.org/wiki/Ed_(text_editor));) – bames53 2012-07-09 20:59:23

+0

我想通了。只是想確定。如果你做了= P,我認爲我不會接受你的建議 – anthropomorphic 2012-07-09 21:01:51