2009-10-21 47 views
0

我在我的源文件(* .c)中使用了一些宏。確定確切的頭文件

在編譯過程中還是從庫中,我可以識別出這個特定的宏正在解析的確切的頭文件是否有任何方法?

問題是我們在一些頭文件中使用宏#defined爲10,但在代碼中接收的值是4。因此,我們不想檢查所有dep文件,而是想知道是否有一些直接的方法來確定宏解決的來源。

+1

爲什麼不運行簡單搜索或grep? – Naveen 2009-10-21 14:06:17

回答

7

如果你只是在文件中運行CPP(C預處理器),輸出將包含形式

#line 45 "silly-file-with-macros.h" 

的#line指令編譯器說,這裏的一切是從哪裏來的。因此,一種方法是使用

cpp my-file.c | more 

並查找#line指令。

取決於你的編譯器,你可以使用另一個技巧是重新定義宏別的東西,編譯器會吐出像

test-eof.c:5:1: warning: "FRED" redefined 
test-eof.c:3:1: warning: this is the location of the previous definition 

警告(這是從GCC),它應該告訴你在哪裏該宏是先前定義的。但是,想想看,你是不是已經得到這個警告了?

另一個想法是使用makedepend來獲取所有包含文件的列表,然後grep他們的#define線在其中。

+0

這是正確的答案 – 2009-10-21 14:11:52

+0

答案的第一部分的問題是,預處理文件會刪除所有'#define'指令和所有使用'MACRONAME'的實例(這就是預處理器的作用),所以沒有任何東西爲grep。但技巧2是非常有效的。 – 2009-10-21 14:29:04

+0

你是對的,宏將不復存在。我應該先測試一下! – 2009-10-21 14:36:01

2

grep for #define?

+0

與此問題是什麼文件grep。如果使用「makedepend」,可以獲得完整的依賴列表,然後將其作爲參數提供給grep。 – 2009-10-21 14:20:18

+0

您項目中的所有文件。如果它不在那裏,那麼你就重新定義了你不應該觸及的東西。 – Marcin 2009-10-21 14:23:11

+0

雖然這不是問題所在,但是追查那些本來不應該被重新定義的東西? – 2009-10-21 14:29:09

0
find/-name '*.h' | xargs -L 100 grep -H macroname 

這裏有三個命令。 find命令會選擇要搜索的文件,以便將其更改爲'.c'或' .cpp'或您需要的任何文件。然後,xargs命令將文件列表一次拆分爲100個,這樣就不會溢出一些內部shell命令緩衝區大小。然後,grep命令重複運行,每個列表包含100個文件,並打印包含macroname和使用它的代碼行的所有文件名。

由此你應該能夠看到它被重新定義的位置。

+0

如果它在系統中定義,則不包括 – 2009-10-21 14:10:58

+0

由於您正在搜索可能未包含在文件中的文件,因此這並沒有什麼意義。 – 2009-10-21 14:11:15