2011-10-28 38 views
2

我遇到了其中一個頭文件中的#define在另一個頭文件中打破枚舉聲明的情況。找到打破編譯的#定義

gcc使用-E開關我已經確定我有

#define OFF 0 

地方。

問題是,我怎麼知道在哪裏?該項目非常龐大,包含數十個目錄,數百個包含文件。我會最終做一個全局的grep,但問題是,有什麼辦法可以問gcc編譯器哪裏出現#define?它顯然擁有這些信息!

更新:感謝沒有一個,但兩個解決方案 - SO通過。 只是爲了記錄,罪魁禍首是Sybase客戶端庫的一個包括(ctlib,甚至沒有dblib)。哎喲。

+5

使用grep。只需使用grep。 –

+0

爲了闡述,你可以做下面的事情:「grep -r'#define OFF'。」「 – jayunit100

+0

它的確如此。但只有當你問得很好,並使用魔術字。缺席,這將是grep。 – gnometorule

回答

15

您可以重新定義它(以不同的值)。然後gcc會告訴你它已經定義在哪裏。

在我的系統,它看起來像這樣:

在文件從<包括了一些文件>:27,

   from < another file >:13: 

<頭文件與重新定義的值>:30:1:>警告:「< the definition>」重新定義

<命令行>:警告:這是以前的位置 定義

+1

+ 1爲OP的問題提供了一個明智的解決方案。 –

2

一個好的解決方案是運行「ctags」之類的東西,它基本上構建了一個在代碼中定義的符號數據庫。然後,許多流行的編輯器(vim,emacs)將讀取標籤文件,並讓您快速跳轉到名稱定義。例如,使用vim我只需輸入:

:ta myfunction 

查找myfunction的定義。這對於使用#define創建的宏同樣適用,它支持C以外的各種語言。我使用的是exhuberant ctags,這是您在RHEL-ish系統上安裝ctags時得到的結果,但它在Debian中肯定可用, Ubuntu,OS X等等。

+0

在Ubuntu(也可能是Debian)上:'apt-get install exuberant-ctags' –

5

使用選項-dD和-E。使用這兩個選項可以看到包括定義在內的預處理結果。只要看看你的宏(像#define OFF 1)並向上滾動到# number filename,你會發現最後一個包含文件,所以它就是你定義宏的那個文件。

+0

+1爲另一個聰明的確切解決方案。 –