2013-04-09 102 views
1

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

我不会讨论如何使用这样的宏来做一个好的练习,因为我对此没有太多的了解。但是我想知道在预处理和编译之间是否可以向编译器添加一个阶段(我使用几个编译器:icc,gcc,xlc),所以我发现sed命令。

回答

0

现在,我会尝试使用我在this post中发现的内容。我也尝试了用于编译单个文件的包装选项,并且目前它还是有技巧的。在包装器中,我预处理(使用-E)文件,然后使用sed和一些规则处理预处理文件,然后编译它。

3

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

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

然后运行sed脚本,并编译它与G ++(无-E这个时候)输出。我敢肯定,你可以在你的Makefile中构建一个完成所有这些的规则。

+0

是的,我可以,但也有很多的Makefile,并会改变规则。我想知道是否有办法专门告诉编译器在编译阶段和其他编译阶段之间做些什么。 – 2013-04-09 15:02:17

+0

我不认为gcc有这样的事情,也许其他编译器确实拥有它。 – piokuc 2013-04-09 15:12:04

+2

@Genís,一个标准的技巧是使用一个包装脚本,它会调用'g ++'两次,为第一次运行添加'-E'并更改'-o'文件名。 – 2013-04-10 16:38:37

0

定义你自己的“编译”的脚本运行g++ -E,那么你的sed -mangler,然后g++,并指定一个整体的编译器。请注意使用mktemp提供的临时文件,所以同时开始编译(make -j)不会搞砸了。

(今天的GCC没有单独的预处理步骤了,所以注入的东西还有不易反正来完成。)