g ++:有没有办法在正在编译的代码中访问编译标志?

时间:2014-12-12 16:19:03

标签: c++ gcc

是否有一种方法(例如,定义的常量)来访问编译器标志,编译器在正在编译的代码中运行。

例如,我想要一个程序来编写用于编译它的标志。

int main(){
    std::cout << COMPILE_FLAGS << std::endl;
}

gcc / g ++是否存在这样的常量?甚至更好:是否有在gcc和clang中都定义的常量?

我特别感兴趣的是检查优化级别和-march标志的值。那么,如果没有显示所有标志的常量,那么至少有一些显示这些值吗?

2 个答案:

答案 0 :(得分:1)

以下命令打印出所有预定义的宏:

g++ -dM -E - < /dev/null

这适用于gcc和g ++。您可以检查自己 - 不幸的是,没有宏,可以轻松访问完整的gcc / g ++命令行。

幸运的是,大多数 -m ... 标志会导致定义足够的预编译器宏。例如, -m64 定义 __ x86_64 -m32 定义 __ code_model_32 __ 。或 -march -march = core-avx2 会产生 #define __core_avx2__

只需在上面的命令行中添加您需要检查的选项,然后检查新宏定义的结果。

答案 1 :(得分:0)

如果您能够更改编译标志或生成编译命令的脚本,您可以添加 -DCOMPILE_FLAGS =&lt; 您感兴趣的标志 &GT;你的构建实际创建那个常量。

来自GCC manual

  

-D name = definition定义的内容被标记化并处理,就像它们在a的翻译阶段3中出现一样   '#define'指令。特别是,该定义将被截断   通过嵌入的换行符。