【问题标题】:Add compiler stage添加编译阶段
【发布时间】:2013-04-09 14:42:56
【问题描述】:

我需要调试包含大量宏的 C 代码,其中有一堆宏根本不重要,它们包括几行(很多)。这使得调试变得不可能,因为宏在一行中展开,你永远不知道错误来自哪里。另一方面,使用sed 可以轻松获取预处理器输出并在每个分号后添加行。

我不会讨论使用此类宏的好习惯,因为我对此无能为力。但我想知道是否可以在预处理和编译之间为编译器添加一个阶段(我使用了几个编译器:icc、gcc、xlc),所以我运行了sed 命令。

【问题讨论】:

    标签: c gcc compiler-construction icc


    【解决方案1】:

    你可以做的是只运行预处理器(-E):

     $ g++ -E in.c -o in.i
    

    然后运行您的 sed 脚本并使用 g++ 编译它的输出(这次没有 -E)。你可以在你的 Makefile 中构建一个规则来做这一切,我敢肯定。

    【讨论】:

    • 是的,我可以,但是有很多 Makefile 和规则会改变。我想知道是否有办法专门告诉编译器在一个编译阶段和另一个编译阶段之间做一些事情。
    • 我不认为 gcc 有这样的东西,也许其他编译器有。
    • @Genís,一个标准的技巧是使用一个包装脚本,它会调用g++ 两次,在第一次运行时添加-E 并更改-o 文件名。
    【解决方案2】:

    现在,我将尝试在this post 中找到的内容。我还尝试了使用包装器来编译单个文件的选项,目前,它可以解决问题。在包装器中,我预处理(使用-E)文件,然后使用sed 和一些规则处理预处理文件,然后编译它。

    【讨论】:

      【解决方案3】:

      将您自己的“编译器”定义为运行g++ -E 的脚本,然后是您的sed-mangler,然后是g++,并将其指定为整体编译器。请注意使用 mktemp 提供的临时文件,因此并行启动编译 (make -j) 不会搞砸。

      (今天的 GCC 不再有单独的预处理步骤,因此无论如何都不能轻松地在那里注入一些东西。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-11
        • 1970-01-01
        • 2015-04-13
        • 1970-01-01
        • 1970-01-01
        • 2016-04-23
        相关资源
        最近更新 更多