1

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

#define <commonly_used_word> 0

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

4

4 回答 4

5

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

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

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

#define INCLUDE_FILE "stdio.h"
#include INCLUDE_FILE 

实现您想要的需要专门设计用于满足您的要求的预处理器。一方面,我不知道任何这样的预处理器实现。

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

于 2012-08-20T22:26:07.303 回答
2

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

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

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

如果您不希望系统包含 like #include <stdio.h>,请使用 -MM Like -M 但不要提及在系统头目录中找到的头文件,也不要提及从此类头文件中直接或间接包含的头文件。gcc -MM test.c

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

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

于 2012-08-20T22:34:41.580 回答
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
于 2012-08-20T22:39:29.423 回答
1

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

于 2012-08-20T22:41:41.280 回答