2012-03-30 88 views
2

假設您有100個源文件(.c或.cpp)文件,並且您希望在其中包含一些定義,函數/變量聲明。通常在C/C++中,爲此目的使用頭文件。但在這種情況下,您需要在每個源文件中放置#include「header.h」。在每個源文件中包含一個頭文件

現在我的問題是,是否有一種方法可以在每個文件中都不包含#include「header.h」的情況下包含所有文件的一個頭文件,因爲編寫#include「header.h會很麻煩。 「對於100多個源文件。

+1

沒有,但你可以寫一個python腳本在約5分鐘爲你做這個。 – TJD 2012-03-30 15:01:42

+0

@TJD,不是嗎?你絕對可以做到。 – 2012-03-30 15:57:21

+0

@CarlNorum,有趣的是,我並不知道-include選項 – TJD 2012-03-30 16:18:31

回答

6

您可以使用-include標誌作爲clang或GCC。從man page

-include文件

過程文件彷彿"#include "file""出現作爲主源文件的第一行。但是,搜索第一個目錄的文件是預處理器的工作目錄而不是包含主源文件的目錄。如果在那裏找不到,那麼在"#include "...""搜索鏈的其餘部分搜索它是正常的。

如果給出多個-include選項,則會按照文件在命令行上的顯示順序包含這些文件。

實施例:

clang -include header.h -c file1.c 
clang -include header.h -c file2.c 
clang -include header.h -c file3.c 
clang -o app file1.o file2.o file3.o 

MSVC具有/FI flag,這是類似的。

+0

是的,我只編譯叮噹聲或gcc。但我在網上找不到任何例子。你介意分享一個嗎?謝謝。 – pythonic 2012-03-30 15:07:38

1

你不能這樣做,儘管你可以爲你寫一個腳本來完成它。獲取每個文件的腳本,並在頂部寫入#include "header.h"編輯:-include在gcc做到這一點。

但是,您需要的是通過編譯器選項以不同方式實現的。在海灣合作委員會,與-D

假設您要在所有源文件中將定義DEBUG_LEVEL設置爲2。你可以簡單地通過調用這樣GCC做到這一點:

gcc -DDEBUG_LEVEL=2 

注意,在這種情況下,您將需要重建所有項目(這將原本就做,如果你已在1個文件中改變了這種定義其中所有源文件都依賴於)

+0

是的,我知道-D選項,但它只是頭中#define的替代品。通常你在頭文件中還有其他的東西,比如聲明,宏等等。 – pythonic 2012-03-30 15:05:28

+0

@CarlNorum,是的,我剛剛明白!我會更新 – Shahbaz 2012-03-30 15:07:18

0

頭文件不是定義 - 它們是聲明。

你儘量少放置 - 保存編譯器工作以及相互依賴關係。

您甚至可以通過在這些頭文件中使用前向聲明來進一步減少數量。

如果你很聰明,你可以讓你的IDE幫助你填補空白,而不是傷害你的手指。

+0

「頭文件不是定義 - 它們是聲明」 - 它們通常是一種混合:對於採用可執行空間的東西,它們往往是聲明,但對於類,模板,內聯函數(定義等)。前向聲明是 - 恕我直言 - 糟糕的做法 - 你應該更喜歡額外的前向聲明頭文件,例如 - 標準庫的'' - 這樣包含層次結構確保了一致性,並且所有權歸於聲明的組件 - 它確保重新編譯在類型被typdefs替換爲特定的模板實例。 – 2012-03-30 15:20:06

+0

@TonyDelroy - 聲明是說事情會發生的事情。至於內聯函數,它們根本不需要編譯!如果'.cpp'文件需要它們,那麼編譯器只是補充它。至於轉發聲明,它們節省了大量的編譯和開發時間。 * Scott Myers *閱讀關於該主題的書 - 很少有您需要包含代碼編譯的文件。畢竟,使用它的任何代碼都需要包含該部分。其他不使用包含文件的組件的代碼可以用前向聲明忽略它。 – 2012-03-30 15:44:44

+0

@TonyDelroy IMO對於頭文件來說要求客戶端按照特定的順序包含頭文件,或者頭文件包含其他頭文件,或者頭文件是單塊的,而不是分成合理的,設計良好的模塊,這是不好的做法。爲了避免這些事情,往往需要前向聲明。我不認爲前瞻性聲明的缺點在哪裏。 – bames53 2012-03-30 15:57:34

3

是的,這將是無聊的。這就是爲什麼你使用的外殼 ...

下面的神祕咒語將做幾乎按鍵敲擊你所要求的!

find ./ -name "*.c" -or -name "*.cpp" | xargs -n 1 sed -i '1 i #include <my_header.h>' 

跪拜UNIX,異教徒的強大力量......

+0

對不起,我忍不住了...... – brice 2012-03-30 15:23:04

相關問題