调试C++预处理器

Ale*_*lex 15 c++ c-preprocessor

我正在努力建造Amaya.当构建失败时

错误:在'('标记之前的预期unqualified-id

我在没有编译的文件上只使用预处理器(用-E替换-c选项)运行g ++以查看发生了什么.这产生了一个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) 
Run Code Online (Sandbox Code Playgroud)

所以添加#undef Blue解决了这个问题.因此,使用-M和grep的这种组合似乎没问题,但有时候C++预处理器定义可能是真正的森林; 我很好奇是否有更好的方法,一些聪明的GNU工具可能.

Emp*_*ian 11

我发现跑步了

g++ ... -dD -E $file > $file.ii
Run Code Online (Sandbox Code Playgroud)

在解决预处理问题时非常有用.来自man g++:

-dD Dump all macro definitions, at the end of preprocessing,
    in addition to normal output.
Run Code Online (Sandbox Code Playgroud)


Ste*_*sop 3

如果没有人提出更好的方案(基于预处理文件中的源行信息),您可以使用 -M 选项来获取源文件包含的标头列表,并在其中搜索“Blue”。我预计某种混淆可能意味着找不到您要查找的内容,但通常您会在某处找到定义。