2009-07-05 106 views
15

我正在嘗試構建Amaya。當構建與調試C++預處理器

error: expected unqualified-id before ‘(’ token

未能我跑了G ++只與預處理器上無法編譯,看看發生了什麼事情的文件(-E代替-c選項)。這產生了一個80,000行文件,告訴我'Blue'已被(2 < < 8)所取代,這清楚地解釋了錯誤。如果我糾正這個問題,文件編譯得很好。我想我可以忍受這一點,但我想知道爲什麼會發生這種情況。

有什麼辦法可以跟蹤預處理器如何替換特定的字符串,在這種情況下,'藍'?

=================更新===================

好了,我找到了罪魁禍首:

> headers=`g++ [omited for brevity] -M \ 
    ../../thotlib/dialogue/AmayaClassicNotebook.cpp` 

> for file in $headers ; do grep -s -H Blue $file | grep "(2 << 8)";done 

/usr/local/include/gc.h:#define Blue (2 << 8) 

所以加上#undef藍修正了這個問題。因此,使用-M和grep的組合似乎可以,但有時C++預處理器定義可能是真正的森林;我很好奇是否有更好的方法,也許有一些聰明的GNU工具。

+0

哪個平臺? – laalto 2009-07-05 12:04:23

+0

i686 GNU/Linux。 – Alex 2009-07-06 21:43:40

回答

3

如果沒有人提出更好的方案(基於預處理文件中的源代碼行信息),可以使用-M選項來獲取源文件包含的頭文件列表,並搜索那些「Blue」 。我希望某種模糊處理可能意味着這並不能找到你要找的東西,但通常你會在某處找到定義。

+0

這應該被覆蓋-E – 2009-07-05 12:08:08

1

有什麼不好常年

find /src -exec grep Blue {} /dev/null ';' 

這通常對我的作品,至少作爲第一晉級。

+0

grep的另一個地方是系統頭像/ usr/include。 – laalto 2009-07-05 12:10:36

10

我會覺得跑步

g++ ... -dD -E $file > $file.ii 

是在解開預處理的問題是非常有用的。來自man g++

-dD Dump all macro definitions, at the end of preprocessing, 
    in addition to normal output.