是否有一种方法(例如,定义的常量)来访问编译器标志,编译器在正在编译的代码中运行。
例如,我想要一个程序来编写用于编译它的标志。
int main(){
std::cout << COMPILE_FLAGS << std::endl;
}
gcc / g ++是否存在这样的常量?甚至更好:是否有在gcc和clang中都定义的常量?
我特别感兴趣的是检查优化级别和-march
标志的值。那么,如果没有显示所有标志的常量,那么至少有一些显示这些值吗?
答案 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'指令。特别是,该定义将被截断 通过嵌入的换行符。