如果传递冲突的编译器标志,GCC如何表现?

Vil*_*ray 12 c linux gcc

我知道如果你执行GCC:

gcc -O3 -O2 foo.c
Run Code Online (Sandbox Code Playgroud)

GCC将使用传递的最后一个优化标志(在本例中O2).但是,这对所有旗帜都是如此吗?例如,如果我像这样执行GCC:

gcc -mno-sse -msse bar.c
Run Code Online (Sandbox Code Playgroud)

它会支持SSE,因为那是传递的最后一个标志,还是会导致未定义的行为?我最初的实验似乎表明它将支持SSE,但我不确定这是否适用于所有情况.

Car*_*rum 15

正如您在第一个示例中提到的那样,通常以后的行选项会覆盖之前传递的选项.我个人没有遇到任何不同的行为-m-f标志,但我不知道文档中的具体参考.

请注意,某些选项不会以这种方式运行:

$ gcc example.c -DABC -DABC=12
<command-line>: warning: "ABC" redefined
<command-line>: warning: this is the location of the previous definition
Run Code Online (Sandbox Code Playgroud)

所以需要-UABC在那之间关闭那个警告.

clang顺便说一句,特别擅长解决这个问题 - 如果忽略命令行选项会产生警告,这可以帮助你解决问题.

  • 值得注意的是,即使在你的例子中,gcc仍然表现为"线路上的后续选项覆盖以前传递的方式".只是它**也会给你一个警告. (6认同)