预处理前的C / C ++文件

时间:2012-08-20 22:22:02

标签: c-preprocessor preprocessor-directive

是否可以在预处理之前查看c / c ++文件?或者更确切地说,只是半心半意的预处理?基本上有一个

#define <commonly_used_word> 0

在第三方库标题中,我想知道它在哪里。所以基本上,我只是希望编译器包含所有头文件而不是预处理器。

4 个答案:

答案 0 :(得分:5)

在预处理之前,您的原始源文件文件。

听起来您希望处理#include指令,但是您希望保持宏不被替换。这两个动作都由预处理器执行。

一般情况下是不可能的,因为在C和C ++中使用宏作为包含文件名是合法的,如

#define INCLUDE_FILE "stdio.h"
#include INCLUDE_FILE 

实现您想要的功能需要专门设计的预处理器来满足您的要求。例如,我不知道任何这样的预处理器实现。

如果要查找定义特定宏的位置,可以尝试以下技巧:在之前使用相同名称​​定义自己的宏(包括任何标头),然后开始编译。编译器(预处理器)在遇到同一个宏的库定义并指出它的位置时,应该抱怨宏重定义。

答案 1 :(得分:2)

有特定于GCC的-M-MM选项:

  

要列出包含文件的绝对路径,请使用-M

     

输出规则,而不是输出预处理的结果   适合描述主源文件的依赖关系。   预处理器输出一个包含目标文件名的make规则   对于该源文件,冒号和所有包含的名称   文件,包括来自-include或-imacros命令行的文件   选项。 gcc -M test.c

     

如果您不希望系统包含类似   #include <stdio.h>,   然后使用-MM Like -M但不提及找到的头文件   系统头目录,也不包括头文件,   直接或间接地从这样的标题。 gcc -MM test.c

这可能会大大缩小搜索范围。

http://www.math-linux.com/spip.php?article263

答案 2 :(得分:1)

您可以使用cpp选项告诉-M生成所包含文件的列表:

$ cpp -M a.c
a.o: a.c /usr/include/stdio.h /usr/include/features.h \
 /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
 /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
 /usr/lib/gcc/x86_64-pc-linux-gnu/4.7.1/include/stddef.h \
 /usr/include/bits/types.h /usr/include/bits/typesizes.h \
 /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
 /usr/lib/gcc/x86_64-pc-linux-gnu/4.7.1/include/stdarg.h \
 /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h

它为您提供了一个Makefile规则格式,但您可以忽略它并与任何其他命令一起使用。

例如,你可以grep这个符号(这里我忽略了stderr,因为\a.o:不是真正的文件名 - 懒惰):​​

$ grep '#\s*define\s*BUFSIZ' $(cpp -M a.c) 2>/dev/null
/usr/include/stdio.h:# define BUFSIZ _IO_BUFSIZ

您还可以使用ctags之类的程序为您找到符号:

$ ctags $(cpp -M a.c)
...
$ grep BUFSIZ tags 
BUFSIZ  /usr/include/stdio.h    128;"   d

答案 3 :(得分:1)

如果你知道哪些头文件包含你正在寻找的定义,例如通过使用建议的find和grep,你可以通过获取gcc来打印头包含树来确定哪一个影响当前源文件。如gcc的documentation中所述,您可以使用-H选项实现此目的,可能与-MG结合使用以消除正常处理。