避免#includes的预处理

时间:2012-01-05 12:21:31

标签: c gcc

我有一些C源,我想要扩展#define个宏(和#ifdefs等等)但不是#includes#includes应保持不变。

是否可以使用cpp(C预处理器)?

6 个答案:

答案 0 :(得分:2)

不,事实并非如此,因为#include是一个预处理器指令。

唯一的可能性是在删除 #include指令后在文件上启动cpp。

如果你有一个带有GNU grep的Unix shell,可以这样做,例如:

grep -Pv '^\s*#\s*include\b' thefile.c|cpp

答案 1 :(得分:2)

没有直接的方法..所以我尝试了以下程序,它适用于我拥有的大多数.c文件。我已经使用@fge grep并添加了一些代码以及gcc -E ..希望这会有所帮助!

#!/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 :(得分:1)

如果包含的文件如下:

inc_file1.h

#if !defined(INC_FILE1_H)
#define INC_FILE1_H

/// some code

#endif

然后你可以自己定义INC_FILE1_H,导致inc_file1.h内部声明不被处理

答案 3 :(得分:1)

如果您有一个源文件(或只有少数几个),您可以做的是评论#include指令,例如:

#if 0
#include "include1.h" 
#include "include2.h" 
#endif

然后在源文件上运行预处理器。

答案 4 :(得分:1)

如果您有方便的Emacs:c-macro-expand绑定到 C-c C-e 只能展开标记的区域。这也将考虑包含,但会将命令的输出限制为标记的部分。如果你进行宏编程,这是最好的命令之一。

答案 5 :(得分:0)

使用GCC,这是不可能的。