生成标头中定义的所有预处理器符号的列表

keb*_*ebs 13 macros gcc c-preprocessor

假设我使用了一些C或C++库,它们是由标题和一些源文件组成的,它们被编译成我可以链接的静态或共享库.

在库的标题中(数十个......或数百个文件),定义了一些宏/符号.

现在我想在一个项目中使用这个库,它也定义了一些宏和符号.当然,我想避免名称冲突,因为有时会报告,特别是对于windows.h.但更一般地说,我希望控制从该标题中真正导出的内容.

我可以使用gcc预处理器选项生成已定义符号的列表:

gcc -E -dM include/great_lib.h | sort -V >symbols.txt
Run Code Online (Sandbox Code Playgroud)

这在文件symbols.txt中输出包含该标题时包含在用户文件中的所有定义符号的排序列表.

但是,它只给出符号,而不是给定义它的文件.

我觉得这可能是一个有用的信息.例如,检查是否在"great_lib.h"或其优先级中重新定义了某个系统宏.不幸的是,在检查gcc预处理器选项后,我没有看到使用gcc的方法.

例如,而不是只给我:

#define M_PI 3.14159265358979323846
Run Code Online (Sandbox Code Playgroud)

它会产生

#define M_PI 3.14159265358979323846; /usr/include/math.h
Run Code Online (Sandbox Code Playgroud)

也许是-dN选项的东西?但它的输出对我来说很困惑,它需要进一步的文本处理,我不明白信息是如何分层的.还是更简单的方法?

相关问题:

jmh*_*jmh 1

一种快速的 Unix 方法:

find "$PATH_TO_LIB" -name "*.h" | xargs grep "^[ \t]*#[ \t]*define"
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用 sed 和 sort 来稍微清理一下格式。

另外,根据 gcc 手册,gcc 会警告您此类事情。

http://gcc.gnu.org/onlinedocs/cpp/Undefining-and-Redefining-Macros.html

如果使用与旧定义实际上不同的定义重新定义宏,则预处理器会发出警告并更改宏以使用新定义。如果新定义实际上相同,则重新定义将被默默忽略。例如,这允许两个不同的标头定义一个公共宏。仅当定义不匹配时,预处理器才会抱怨。