我有一些C源,我想要扩展#define
个宏(和#ifdefs
等等)但不是#includes
。 #includes
应保持不变。
是否可以使用cpp(C预处理器)?
答案 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,这是不可能的。