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