我知道如果你这样执行GCC:
gcc -O3 -O2 foo.c
GCC将使用传递的最后一个优化标志(在本例中为O2
)。但是,这对所有旗帜都是如此吗?例如,如果我像这样执行GCC:
gcc -mno-sse -msse bar.c
它是否支持SSE,因为那是传递的最后一个标志,还是会导致未定义的行为?我最初的实验似乎表明它将支持SSE,但我不确定这是否适用于所有情况。
答案 0 :(得分:13)
正如您在第一个示例中提到的那样,通常以后的行选项会覆盖之前传递的选项。我个人没有遇到-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
特别擅长解决此问题 - 如果忽略命令行选项会产生警告,这可以帮助你解决问题。