GCC转储预处理器定义

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

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

  gcc -dM -E - < /dev/null 

从gcc手册 :

为预处理器执行期间定义的所有macros(包括预定义的macros)生成一个`#define'指令列表,而不是正常的输出。 这使您可以find预处理器版本中预定义的内容。 假设你没有文件foo.h,该命令

 touch foo.h; cpp -dM foo.h 

将显示所有预定义的macros。

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

我通常这样做:

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

请注意,一些预处理器定义依赖于命令行选项 – 您可以通过将相关选项添加到上述命令行来testing这些选项。 例如,要查看默认启用了哪些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 

迟到的答案 – 我发现其他答案有用 – 并想增加一点额外的。


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

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

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

 $ echo "#include <sys/socket.h>" | gcc -E -dM - | grep SOMAXCONN #define SOMAXCONN 128 $ 

简单的方法( gcc -dM -E - < /dev/null )适用于gcc,但g ++失败。 最近我需要testing一个C ++ 11 / C ++ 14function。 其相应的macros名称的build议发布在https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations 。 但:

 g++ -dM -E - < /dev/null | fgrep __cpp_alias_templates 

总是失败,因为它静静地调用C驱动程序(就像由gcc调用一样)。 你可以通过比较它的输出与gcc的输出或者通过添加一个g ++特定的命令行选项(如-std = c ++ 11)来发现错误信息cc1: warning: command line option '-std=c++11' is valid for C++/ObjC++ but not for C

因为(非C ++)gcc 永远不会支持“模板别名”(见jtc1/sc22/wg21/docs/papers/2007/n2258.pdf ),所以你必须添加-x c++选项来强制调用C ++编译器(使用-x c++选项的信誉而不是空的虚拟文件转到yuyichao,见下文):

 g++ -dM -E -x c++ /dev/null | fgrep __cpp_alias_templates 

将不会有输出,因为g ++(修订版4.9.1,默认为-std = gnu ++ 98)默认情况下不启用C ++ 11function。 为此,请使用

 g++ -dM -E -x c++ -std=c++11 /dev/null | fgrep __cpp_alias_templates 

最后收益

 #define __cpp_alias_templates 200704 

注意到g ++ 4.9.1在用-std=c++11调用时确实支持“模板别名”。

在Windows(没有/ dev / null)或Linux的情况下工作得更好的更便携的方法:

 echo | gcc -dM -E - 

在一个复杂的构build系统,很难直接获取(或修改)gcc / g ++命令的大项目中工作时,还有另一种方法来看看macros扩展的结果。 只需重新定义macros,你将得到类似于以下的输出:

 file.h: note: this is the location of the previous definition #define MACRO current_value