gcc 仅运行预处理程序,但仅对某些语句运行

ijnw1ujt  于 2022-11-13  发布在  其他
关注(0)|答案(6)|浏览(169)

我在一个程序中定义了许多调试语句,我希望能够在没有这些语句的情况下复制源代码。
为了做到这一点,我首先查看了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是否缺少一个指令,或者是否有一个工具能够做到这一点?

sirbozc5

sirbozc51#

如果-E没有帮助,那么尝试使用-fdump-tree-all,如果你没有看到你想要的东西,那就是GCC没有提供的。
OTOH,这个问题已经在下面的SO中讨论过了,请参考下面的内容来获得一些想法。

  1. Can gcc output C code after preprocessing?
  2. How do I see a C/C++ source file after preprocessing in Visual Studio?
    希望能有所帮助!
    嗨,麦特,
    我看到了你对@nos的评论。但是我手边有一个这样的脚本,所以和你分享。你可以在这里尝试阅读我对类似问题的回答
    将下面的代码复制到一个文件中,比如convert.sh。为该文件chmod +x convert.sh分配执行权限,然后运行它,如下所示:
$./convert.sh <filename>.c
$cat filename.c.done

<filename>.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

希望这对你有帮助!

ajsxfq5m

ajsxfq5m2#

gcc -E -nostdinc test.c产生

# 1 "test.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 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

您可以轻松地过滤掉#行...并重新添加includes。

zzoitvuj

zzoitvuj3#

gcc预处理器没有直接的方法来实现这一点,但是如果只包含系统头,那么gcc -E -nostdinc可能会带来一些好运。
但是,您可以注解掉#include指令和其他不希望处理的预处理器指令,并通过预处理器(gcc -Ecpp)运行代码,这样,只有您希望展开的宏(未注解掉的宏)才会展开。

brjng4g3

brjng4g34#

可以使用unifdef、unifdefall等工具-从代码中删除预处理器条件。(Run a "light" preprocessor for GCC

disho6za

disho6za5#

我知道这个问题很老了,但现在确实有了答案。“C部分预处理器”正是这样做的。
http://www.muppetlabs.com/~breadbox/software/cppp.html
作为参考,如果别人仍然想知道(我做了,发现了这个页面)。

bqucvtff

bqucvtff6#

也称为cpp -P <file> [outputfile]

  • 一个.txt文件:*
file: __FILE__
#ifdef X
"X" has been defined
#endif

cpp -P -DX a.txt文件

相关问题