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

时间:2012-01-03 13:57:19

标签: c gcc c-preprocessor

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

为了做到这一点,我首先查看了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;
}

然后我可以用astyle这样的东西整理一下,不需要手工操作来获得我想要的东西。

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

5 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

如果-E没有帮助,请尝试使用-fdump-tree-all,如果您没有看到您想要的内容,那么{-3}中不可用(或)未提供内容}}。

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

  1. GCC
  2. Can gcc output C code after preprocessing?
  3. 希望它有所帮助!


    嗨Mat,

    我看到你对@nos的评论。但我有一个这样的脚本方便,所以与你分享。您可以尝试阅读我的答案以获得类似的问题How do I see a C/C++ source file after preprocessing in Visual Studio?

    将以下代码复制到文件中,例如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
    

    希望这有帮助!

答案 2 :(得分:2)

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

但是,您可以注释掉#include指令以及您不希望处理的其他预处理程序指令,并通过预处理器(gcc -Ecpp)运行代码,只有你想要扩展的宏(没有注释掉的那些)才会被扩展。

答案 3 :(得分:2)

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

答案 4 :(得分:1)

我知道问题已经过时了,但现在确实有了答案。 &#34; C部分预处理器&#34;就是这样。

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

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