仅运行预处理器,但仅用于某些语句

我在程序中定义了许多调试语句,我希望能够在没有这些语句的情况下复制源代码。

为了做到这一点,我首先看了GCC的-E命令行参数,它只运行预处理器,但这比我想要的要多得多,扩展包含的文件并添加#line语句。

例如:

#include  #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  int main( int argc, char* argv[] ) { puts( "Hello, World!" ); return 0; } 

然后我可以用astyle这样的东西来整理它,并且不需要手动工作来获得我想要的东西。

GCC是否缺少指令或是否有能够执行此操作的工具?

如果-E没有帮助,那么尝试使用-fdump-tree-all ,如果你没有看到你想要的东西,那就是GCC没有提供(或)不提供的东西。

OTOH,这个问题已在SO中讨论如下,请参考以下内容获得一些想法。

  1. 预处理后gcc可以输出C代码吗?
  2. 在Visual Studio中预处理后如何查看C / C ++源文件?

希望能帮助到你!


嗨Mat,

我看到你对@nos的评论。 但我有一个这样的脚本方便,所以与你分享。 您可以尝试在此处阅读我的答案以获得类似的问题

将以下代码复制到文件中,比如convert.sh 。 为该文件分配执行权限chmod +x convert.sh并按如下方式运行:

 $./convert.sh .c $cat filename.c.done 

.c.done将满足您的需求!

 #!/bin/bash if [[ $# -ne 1 || ! -f $1 ]] ; then echo "Invalid args / Check file " exit fi file_name=$1 grep '^\s*#\s*include' $file_name > /tmp/include.c grep -Pv '^\s*#\s*include\b' $file_name > /tmp/code.c gcc -E /tmp/code.c | grep -v ^# > /tmp/preprocessed.c cat /tmp/include.c > $file_name.done cat /tmp/preprocessed.c >> $file_name.done 

希望这可以帮助!

gcc -E -nostdinc test.c生成

 # 1 "test.c" # 1 "" # 1 "" # 1 "test.c" # 9 "test.c" int main( int argc, char* argv[] ) { puts( "Hello, World!" ); return 0; } 

和stderr的错误

 test.c:1:19: error: no include path in which to search for stdio.h 

您可以轻松过滤#行…并重新添加包含。

使用gcc预处理器没有直接的方法,但如果你只包含系统头文件,你可能会对gcc -E -nostdinc有所帮助。

但是,您可以注释掉#include指令以及您不希望处理的其他预处理程序指令,并通过预处理器( gcc -Ecpp )运行代码,这样只会扩展您想要扩展的宏(未注释的宏) out)扩大了。

可以使用unifdef,unifdefall等工具 – 从代码中删除预处理器条件。 ( 为GCC运行“轻型”预处理器 )

我知道问题已经过时了,但现在确实有了答案。 “C部分预处理器”就是这样做的。

http://www.muppetlabs.com/~breadbox/software/cppp.html

作为参考,如果其他人仍然想知道(我做了,发现了这个页面)。