是否可以在预处理之前查看c / c ++文件?或者更确切地说,只是半心半意的预处理?基本上有一个
#define <commonly_used_word> 0
在第三方库标题中,我想知道它在哪里。所以基本上,我只是希望编译器包含所有头文件而不是预处理器。
答案 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
这可能会大大缩小搜索范围。
答案 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结合使用以消除正常处理。