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