我知道,如果您这样执行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特别擅长解决此问题-如果忽略命令行选项,它将产生警告,这可以为您提供帮助。

10-06 16:03
查看更多