我知道如果您这样执行GCC:
gcc -O3 -O2 foo.c
GCC将使用最后一次传递的优化标志(在本例中为O2)。但是,对所有标志都是这样吗?例如,如果我像这样执行GCC:
O2
gcc -mno-sse -msse bar.c
它会支持SSE,因为那是传递的最后一个标志,还是会导致未定义的行为?我的初步实验似乎表明它将支持SSE,但是我不确定在所有情况下是否都适用。
正如您在第一个示例中提到的那样,通常情况下,行上的更高选项会覆盖先前传递的选项。我个人没有遇到过任何不同的行为-m或-f标志,但是我不知道文档中的特定参考。
-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在两者之间必须存在一个中间位置以关闭该警告。
-UABC
clang顺便说一句,它特别擅长解决此问题-如果忽略命令行选项,它将发出警告,这可以为您提供帮助。
clang