19

我知道如果你这样执行 GCC:

gcc -O3 -O2 foo.c

GCC 将使用最后传递的优化标志(在这种情况下O2)。但是,这对所有标志都是如此吗?例如,如果我像这样执行 GCC:

gcc -mno-sse -msse bar.c

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

4

1 回答 1

18

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

请注意,某些选项的行为方式并非如此:

$ gcc example.c -DABC -DABC=12
<command-line>: warning: "ABC" redefined
<command-line>: warning: this is the location of the previous definition

因此,需要-UABC在两者之间留出一个来关闭该警告。

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

于 2013-04-09T18:33:14.653 回答