避免#includes的预处理

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

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

不,它不是,因为#include是一个预处理器指令。

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

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

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

没有直接的方法..所以我尝试了以下程序,它适用于我拥有的大多数.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 

如果包含的文件如下:

 inc_file1.h #if !defined(INC_FILE1_H) #define INC_FILE1_H /// some code #endif 

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

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

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

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

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

有了海湾合作委员会,这是不可能的。