我正在尝试构建Amaya。当构建失败并出现以下错误时:
错误:在“(”标记之前预期未限定的ID
我使用仅带有预处理器的g ++(将-c选项替换为-E)在未能编译的文件上运行,以查看发生了什么。这生成了一个80,000行的文件,向我展示“Blue”已被替换为(2 << 8),这清楚地解释了错误。如果我更正此错误,则该文件可以编译成功。我想我可以接受这一点,但我想找出为什么会发生这种情况。
有没有办法跟踪预处理程序如何替换特定字符串,例如“Blue”?
================= 更新 ===================
好吧,我找到了罪魁祸首:
错误:在“(”标记之前预期未限定的ID
我使用仅带有预处理器的g ++(将-c选项替换为-E)在未能编译的文件上运行,以查看发生了什么。这生成了一个80,000行的文件,向我展示“Blue”已被替换为(2 << 8),这清楚地解释了错误。如果我更正此错误,则该文件可以编译成功。我想我可以接受这一点,但我想找出为什么会发生这种情况。
有没有办法跟踪预处理程序如何替换特定字符串,例如“Blue”?
================= 更新 ===================
好吧,我找到了罪魁祸首:
> 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 Blue 解决了问题。因此,使用 -M 和 grep 的组合似乎可以解决问题,但有时候 C++ 预处理器定义可能会很复杂;我想知道是否有更好的方法,例如一些聪明的 GNU 工具。