2014-12-05 27 views
1

我目前正在使用大量源文件編寫程序。有時很難跟蹤我已經擁有的庫d。理論上,我可以創建一個名爲Headers.h的頭文件,它只包含我需要的所有#include語句,然後將所有其他頭文件#include "Headers.h"帶有所有必要#include語句的單頭文件

爲什麼這是一個好/壞主意?

+0

的#include利弊<比特/ STDC++。H>包含大部分的庫...我不知道它是否包含所有庫... – Mukit09 2014-12-05 04:31:10

+0

假設一些模塊evil.c需要evil.h,它重新定義了innocent.c中使用的一堆符號,也包含內聯函數定義,還有一些巨大的靜態數組聲明可以很好的衡量。你真的想在項目中的其他模塊中包含evil.h嗎? – 2014-12-05 04:34:22

+1

這個想法的好處在於它與Microsoft的預編譯頭文件非常兼容。不幸的是,每個地方通常都包含許多你不需要或想要的東西。 – 2014-12-05 04:55:13

回答

4

優點:

  • ,你不必跟蹤哪個文件中都包括哪些庫標頭或其他compoenents略少維修。

缺點:

  • 定義中包含的文件可能互相沖突。特別是在沒有命名空間的C中(用C和C++標記)
  • 特別是宏可能會導致難以調試的問題,其中宏定義意外地與文件中的某個名稱衝突或其他包含的文件之一
  • 根據您使用的編譯器,編譯時間可能會縮短。如果使用預編譯頭文件的編譯器,它實際上可能會縮短編譯時間,但如果不是相反的話會發生
  • 您經常會不必要地觸發重建文件。如果你的編譯系統設置正確,那麼如果任何包含的文件被修改,每個源文件都將被重建。如果您始終在項目中包含所有標題,則對標題的更改將強制重新編譯所有源文件。不太可能成爲系統頭文件的問題,但如果您也將自己的頭文件包含在主文件中,那將是一個問題。

總的來說,我不會推薦這種方法。上面列出的最後一個con特別重要。

最佳做法是隻包含每個文件中代碼所需的標題。

0

作爲Harmic's answer的補充,確實主要的問題是編譯系統(大多數編譯器都是在文件時間戳上工作,而不是在文件內容上工作,omake是一個值得注意的例外)。

請注意,如果你只關心很多依賴,GNU make可以用autodependencies使用,傳遞給GCC-M*選項(即以g++,實際上給預處理器)在一起。

然而,許多庫提供給他們的用戶的單個報頭(例如<gtk/gtk.h>

另外,一個頭文件是更友好的預編譯頭技術。特別是,GCC wants a single header for precompilation。請參閱ccache

0

追蹤所有需要的包括將更加困難,因爲它們是從它們的C源文件提取並沒有真正支撐模塊化膿所有從#harmic