是否可以在预处理之前查看 ac/c++ 文件?或者更确切地说,只是经过半心半意的预处理?基本上有一个
#define <commonly_used_word> 0
在第三方库标题中,我想弄清楚它在哪里。所以基本上,我只希望编译器包含所有头文件,而不是预处理器本身。
是否可以在预处理之前查看 ac/c++ 文件?或者更确切地说,只是经过半心半意的预处理?基本上有一个
#define <commonly_used_word> 0
在第三方库标题中,我想弄清楚它在哪里。所以基本上,我只希望编译器包含所有头文件,而不是预处理器本身。
您的原始源文件是预处理之前的文件。
听起来您希望#include
处理您的指令,但您希望保持宏不被替换。这两个动作都由预处理器执行。
在一般情况下这是不可能的,因为在 C 和 C++ 中使用宏作为包含文件名是合法的,如
#define INCLUDE_FILE "stdio.h"
#include INCLUDE_FILE
实现您想要的需要专门设计用于满足您的要求的预处理器。一方面,我不知道任何这样的预处理器实现。
如果您想查找特定宏的定义位置,您可以尝试以下技巧:在包含任何标头之前使用相同的名称定义您自己的宏,然后开始编译。编译器(预处理器)在遇到同一个宏的库定义时应该抱怨宏重新定义,并向您指出它的位置。
有特定于 GCC 的-M
选项-MM
:
要列出包含文件的绝对路径,请使用 -M
不是输出预处理的结果,而是输出一个适合make描述主源文件依赖关系的规则。预处理器输出一个 make 规则,其中包含该源文件的目标文件名、冒号和所有包含文件的名称,包括来自 -include 或 -imacros 命令行选项的文件。gcc -M test.c
如果您不希望系统包含 like
#include <stdio.h>
,请使用 -MM Like -M 但不要提及在系统头目录中找到的头文件,也不要提及从此类头文件中直接或间接包含的头文件。gcc -MM test.c
这可能会大大缩小搜索范围。
您可以告诉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
如果您知道哪些头文件包含您要查找的定义,例如按照建议使用 find 和 grep,您可以通过让 gcc 打印头包含树来查明哪个头文件正在影响当前源文件。如 gcc 的文档中所述,您可以通过使用 -H 选项来实现此目的,可能与 -MG 结合使用以消除正常处理。