GCC转储预处理器定义

有没有办法让gcc / g ++从命令行转储它的预处理程序定义? 我的意思是__GNUC____STDC__等等。


是的,使用-E -dM选项而不是-c。 示例(将它们输出到stdout):

 gcc -dM -E - < /dev/null

从gcc手册:

替代正常输出,为预处理器执行过程中定义的所有宏生成一个`#define'指令列表,其中包括预定义的宏。 这为您提供了一种查找预处理器版本中预定义内容的方法。 假设你没有文件foo.h,该命令

touch foo.h; cpp -dM foo.h

将显示所有预定义的宏。

如果使用不带-E选项的-dM,则将-dM解释为-fdump-rtl-mach的同义词。


我通常这样做:

$ gcc -dM -E - < /dev/null

请注意,某些预处理器定义依赖于命令行选项 - 您可以通过将相关选项添加到上述命令行来测试这些选项。 例如,要查看默认启用了哪些SSE3 / SSE4选项:

$ gcc -dM -E - < /dev/null | grep SSE[34]
#define __SSE3__ 1
#define __SSSE3__ 1

然后在指定-msse4时进行比较:

$ gcc -dM -E -msse4 - < /dev/null | grep SSE[34]
#define __SSE3__ 1
#define __SSE4_1__ 1
#define __SSE4_2__ 1
#define __SSSE3__ 1

类似地,您可以看到两个不同的命令行选项集之间哪些选项不同,例如比较优化级-O0 (无)和-O3 (全)的预处理器定义:

$ gcc -dM -E -O0 - < /dev/null > /tmp/O0.txt
$ gcc -dM -E -O3 - < /dev/null > /tmp/O3.txt
$ sdiff -s /tmp/O0.txt /tmp/O3.txt 
#define __NO_INLINE__ 1        <
                               > #define __OPTIMIZE__ 1

迟到的答案 - 我发现其他答案很有用 - 并且想添加一些额外的内容。


如何转储来自特定头文件的预处理器宏?

echo "#include <sys/socket.h>" | gcc -E -dM -

特别是,我想看看我的系统上定义了什么SOMAXCONN。 我知道我可以打开标准头文件,但有时我必须搜索一下才能找到头文件位置。 相反,我可以使用这一行:

$ echo "#include <sys/socket.h>" | gcc -E -dM - | grep SOMAXCONN
#define SOMAXCONN 128
$ 
链接地址: http://www.djcxy.com/p/85783.html

上一篇: GCC dump preprocessor defines

下一篇: What is a .h.gch file?