我在一个程序中定义了许多调试语句,我希望能够在没有这些语句的情况下复制源代码。
为了做到这一点,我首先查看了GCC的-E命令行参数,它只运行预处理程序,然而这远远超出了我的预期,扩展了包含的文件并添加了#line语句。
例如:
#include <stdio.h>
#ifdef DEBUG
#define debug( s ) puts ( s );
#else
#define debug( s )
#endif
int main( int argc, char* argv[] )
{
debug( "Foo" )
puts( "Hello, World!" );
return 0;
}
我希望这个被处理成:
#include <stdio.h>
int main( int argc, char* argv[] )
{
puts( "Hello, World!" );
return 0;
}
然后,我可以整理,与一些类似的风格和没有手工工作将需要得到正是我想要的。
GCC是否缺少一个指令,或者是否有一个工具能够做到这一点?
6条答案
按热度按时间sirbozc51#
如果
-E
没有帮助,那么尝试使用-fdump-tree-all
,如果你没有看到你想要的东西,那就是GCC
没有提供的。OTOH,这个问题已经在下面的SO中讨论过了,请参考下面的内容来获得一些想法。
希望能有所帮助!
嗨,麦特,
我看到了你对@nos的评论。但是我手边有一个这样的脚本,所以和你分享。你可以在这里尝试阅读我对类似问题的回答
将下面的代码复制到一个文件中,比如
convert.sh
。为该文件chmod +x convert.sh
分配执行权限,然后运行它,如下所示:<filename>.c.done
将有你所需要的!希望这对你有帮助!
ajsxfq5m2#
gcc -E -nostdinc test.c
产生并向stderr发送错误
您可以轻松地过滤掉#行...并重新添加includes。
zzoitvuj3#
gcc预处理器没有直接的方法来实现这一点,但是如果只包含系统头,那么
gcc -E -nostdinc
可能会带来一些好运。但是,您可以注解掉
#include
指令和其他不希望处理的预处理器指令,并通过预处理器(gcc -E
或cpp
)运行代码,这样,只有您希望展开的宏(未注解掉的宏)才会展开。brjng4g34#
可以使用unifdef、unifdefall等工具-从代码中删除预处理器条件。(Run a "light" preprocessor for GCC)
disho6za5#
我知道这个问题很老了,但现在确实有了答案。“C部分预处理器”正是这样做的。
http://www.muppetlabs.com/~breadbox/software/cppp.html
作为参考,如果别人仍然想知道(我做了,发现了这个页面)。
bqucvtff6#
也称为
cpp -P <file> [outputfile]
cpp -P -DX a.txt文件