响旗命令

clang W flag order

本文关键字:命令      更新时间:2023-10-16

我注意到clang(我使用3.6.0)有一个有趣的行为,我没有在文档或其他任何地方找到任何关于它的参考。下面是一个小例子:

int main(){
    int a;
    return 0;
}

我用clang++ -Wall -W -Werror -Wno-error=unused-variable main.cpp编译它,我有预期的警告:

main.cpp:2:9: warning: unused variable 'a' [-Wunused-variable]
    int a;
1 warning generated.

现在,我们来试试clang++ -Werror -Wno-error=unused-variable -Wall -W main.cpp

main.cpp:2:9: error: unused variable 'a' [-Werror,-Wunused-variable]
    int a;
1 error generated.
我错过什么了吗?这是意料之中的吗?因此,gcc会编译这两行。

我的回答是:

我认为更好的标题是-Wno-error是位置依赖于命令行,而-Werror不是。重要的部分是诊断是错误还是警告。示例:

int main() {
  int a;
  return 0;
}
$ clang main.cpp -Wunused-variable

给出一个未使用的变量警告。

$ clang main.cpp -Werror -Wunused-variable
$ clang main.cpp -Wunused-variable -Werror

这两种方法都会给出一个未使用的变量错误。-Werror不变基于位置的行为。

$ clang main.cpp -Werror -Wno-error=unused-variable -Wunused-variable
$ clang main.cpp -Werror -Wunused-variable -Wno-error=unused-variable

第一个给出错误,第二个给出警告。这表示-Wno-error=*与位置有关。(海合会将发出这两行都有警告。)

-Werror不与命令行上的警告交互或依赖。-Wno-error=warning与-Wwarning的相对位置有关。

我完全可以接受。它应该写在某个地方(我可能错过了!)