如何使用clang++编译器并加上-std=c++11、-Weverything和-Werror选项

20

我想编译以下文件(temp.cpp):

#include <iostream> 

class Foo {
public:
  Foo() = default;
};

int main(){
  std::cout << "Works!" << std::endl;
  return 0;
}

使用以下命令:clang++ temp.cpp -o temp -std=c++11 -Weverything -Werror

会出现错误信息:

temp.cpp:5:11: error: defaulted function definitions are incompatible with C++98 [-Werror,-Wc++98-compat]

我理解这里有一个类似于c++98-compat的警告,并且它是-everything的一部分。如何使所有警告生效,但排除c++98兼容性?是否有一个-c++11兼容性标志与-Weverything一起使用?


3
添加“-Wno-c++98-compat”选项,但我不确定是否有通用的方法。 - Mat
1
@Mat,你能否把这个作为答案发布,这样我就可以接受它了。 - Kocka
1
"Weverything" 启用所有警告,与 C++98 无关,请尝试使用 "-Wall" 和/或 "-Wextra"。 - user1824407
1
我想要所有不针对c++11的警告。因此,我想要Weverything。仅使用Wall不是一个选项。 - Kocka
这就是为什么我说“-Weverything -Werror”很愚蠢。它会让完全有效的代码因无关紧要的原因而失败。你坚持要将所有警告视为错误,但你并不真正想要所有警告。如果你一定要这样做,那么像@Mat所说的那样,使用“-Wno-xxx”关闭你不想要的特定错误。 - Jonathan Wakely
显示剩余5条评论
1个回答

37

实际上,你可能不想要所有的警告,因为其中许多警告可以被视为是风格或主观性问题,而其他一些(例如你遇到的那个)在你的情况下只是愚蠢的。

-Weverything 最初有两个目的:

  • 发现:否则很难获取所有可用警告的列表
  • 黑名单替代方案:对于gcc,你可以选择要应用的警告(白名单),使用 -Weverything,你可以选择你不想应用的警告;优点是当转移到新版本的编译器时,你更有可能从新的警告中受益

显然,发现并不适用于生产环境;因此,你似乎处于黑名单的情况下。

Clang 诊断系统将默认输出生成警告的最具体警告组的名称(这里是 -Wc++98-compat),每个警告组都可以通过在 -W 后加上 no- 来关闭。

因此,对于黑名单,你可以使用:

-Weverything -Wno-c++98-compat -Wno-...

鼓励您不时地修改黑名单警告列表(例如,在升级到新编译器时)。


2
另外,假设你足够幸运能够使用GCC_WARN_PEDANTIC = YES,那么还有-Wno-c++98-compat-pedantic。 - Flash Sheridan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接