【问题标题】:Debugging the C++ preprocessor调试 C++ 预处理器
【发布时间】:2010-11-08 05:00:56
【问题描述】:

我正在尝试构建 Amaya。当构建失败时

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

我在编译失败的文件上仅使用预处理器(将 -c 选项替换为 -E)运行 g++,以查看发生了什么。这产生了一个 80,000 行的文件,显示“蓝色”已被 (2

有什么方法可以跟踪预处理器如何替换特定字符串,在本例中为“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 工具。

【问题讨论】:

    标签: c++ c-preprocessor


    【解决方案1】:

    我发现跑步

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

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

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

    【讨论】:

    • 如果预处理过程中检测到语法错误,似乎-dD和-E都不输出任何东西,这在某些情况下有点不方便。
    【解决方案2】:

    多年生植物怎么了

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

    这通常对我有用,至少作为第一次剪辑。

    【讨论】:

    • 另一个 grep 的地方是像 /usr/include 这样的系统头文件。
    • 在这种情况下,#define 位于系统位置,而不是源目录下的文件中
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 2015-07-23
      • 2010-09-07
      • 1970-01-01
      • 2011-07-02
      • 2014-02-26
      相关资源
      最近更新 更多