尽管更新,clang 仍会产生有关 c++11 的警告
Posted
技术标签:
【中文标题】尽管更新,clang 仍会产生有关 c++11 的警告【英文标题】:clang produces warning regarding c++11 despite update 【发布时间】:2014-02-20 05:33:32 【问题描述】:最近更新了 clang(以及 xcode 和开发者工具)并运行了一个简单的程序来查看它是否支持 c++11。看起来像这样:
#include <iostream>
using namespace std;
int main()
string my_array[5] = "one", "two", "three";
for (string &x : my_array)
cout << x << endl;
像这样在终端编译:
clang++ -std=c++11 -stdlib=libc++ -Weverything main.cpp
并收到此警告:
main.cpp:17:20: warning: range-based for loop is incompatible with C++98
[-Wc++98-compat]
for (string &x : my_array)
但它仍会生成可执行文件并按预期运行。为什么会产生这个错误?
【问题讨论】:
这不是错误,是警告,而且似乎是因为默认启用了-Wc++98-compat
而产生的。尝试将-Wno-c++98-compat
添加到您的编译器选项以禁用该类警告。
根据 clang.llvm.org/cxx_status.html 基于范围的 for 循环应该从 3.0 开始支持,我认为应该从 XCode 4.2 开始安装
@JoachimIsaksson,我敢打赌它包含在-Weverything
中,而不是默认启用。
@chris 是的,我确认是的,我第一次阅读时错过了-Weverything
,现在编辑为时已晚:)
【参考方案1】:
这是一个警告而不是错误。警告消息还指示启用它的警告标志:-Wc++98-compat。启用此标志是因为您启用了 -Weverything(一个好主意,IMO)。要禁用特定警告,请传递一个带有“no-”前缀的警告标志,并在要禁用的警告名称前添加:
-Wno-c++98-compat
此警告的目的是允许将代码构建为 C++11 并获得一些 C++11 的好处,例如移动语义带来的性能改进,同时仍然生成与旧编译器兼容的代码。也就是说,此警告并不表示程序存在任何问题,并且程序将按照 C++11 规范所指示的方式运行(当然,除了 clang 错误),但警告是通知您,如果您编译成 C++98 就不行了。
如果您不打算将代码构建为 C++98,那么此警告对您没有任何价值,您只需禁用它即可。
我相信现在 clang 支持(可能会被称为)C++14 的最新版本中还有一个 -Wc++11-compat 标志。
【讨论】:
以上是关于尽管更新,clang 仍会产生有关 c++11 的警告的主要内容,如果未能解决你的问题,请参考以下文章
尽管在 Clojure 中对 Java 构造函数有类型提示,但仍会出现反射警告
尽管在 Swing 组件中使用 String.format,但格式仍会摆动