GCC转储预处理器定义

gcc/g ++转储其预处理器从命令行定义的方法吗? 我的意思是像__GNUC__,__STDC__等等。GCC转储预处理器定义

回答:

是的,使用-E -dM选项代替-c。 实施例(它们输出到stdout):

gcc -dM -E - < /dev/null 

从gcc manual:

代替正常输出的,生成 所有 期间定义的宏`的#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

$

回答:

更是很好地工作在Windows便携式办法(那里没有的/ dev/null的)或Linux:

echo | gcc -dM -E - 

回答:

简单的方法( gcc -dM -E - < /dev/null)适用于gcc,但g ++失败。最近我需要测试C++ 11/C++ 14功能。其相应宏名称的建议公布于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将从未支持“模板别名”(见http://www.open-std.org/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 

,将没有输出,因为克++(修订版4.9.1,默认为-STD = GNU ++ 98)不启用默认为C++ 11的功能。为了这样做,使用

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调用支持 “模板别名”。

回答:

在一个复杂构建系统的大项目中工作,并且很难直接获取(或修改)gcc/g ++命令时,还有另一种方法可以查看宏扩展的结果。 简单地重新定义宏,你会得到输出类同如下:对系统中存在其中/ dev/null表示没有

file.h: note: this is the location of the previous definition 

#define MACRO current_value

以上是 GCC转储预处理器定义 的全部内容, 来源链接: utcz.com/qa/263127.html

回到顶部