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选项的东西?但它的输出对我来说很困惑,它需要进一步的文本处理,我不明白信息是如何分层的.还是更简单的方法?
相关问题:
一种快速的 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
如果使用与旧定义实际上不同的定义重新定义宏,则预处理器会发出警告并更改宏以使用新定义。如果新定义实际上相同,则重新定义将被默默忽略。例如,这允许两个不同的标头定义一个公共宏。仅当定义不匹配时,预处理器才会抱怨。
| 归档时间: |
|
| 查看次数: |
3487 次 |
| 最近记录: |