尽管有更新,clang还是会发出关于c++11的警告
clang produces warning regarding c++11 despite update
最近更新了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。启用此标志是因为您启用了-Weverything(一个好主意,IMO)。要禁用特定的警告,您可以在要禁用的警告名称前传递一个前缀为"no-"的警告标志:
-Wno-c++98-compat
此警告的目的是允许将代码构建为C++11,并获得一些C++11的好处,例如通过移动语义提高性能,同时仍然生成与旧编译器兼容的代码。也就是说,这个警告并不表示程序有任何问题,程序将像C++11规范所指示的那样工作(当然,除了clang bug),但警告是为了通知您,如果您要编译为C++98,那么它将不工作。
如果你不打算将代码构建为C++98,那么这个警告对你没有任何价值,你应该简单地禁用它。
我相信在最新版本中也有一个-Wc++11兼容标志,现在clang支持(可能会被称为)C++14。
相关文章:
- MSVC是否支持C++11样式的属性而不是__declspec
- 创建LinkedList退出,返回代码为-11(SIGSEGV)
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 如何将模板转换为C++11之前的模板
- c++11评估顺序(未定义的行为)
- C++中的VLA,扩展名为std=C++11
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- "类模板示例<int>;"语句对 C++11 是什么意思?
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 如何使用lock_guard在c++11中实现scoped_lock功能
- C++11 中不同类型的对象的 std::array 的替代方案
- 为什么 -mmacosx-version-min=10.10 不阻止使用标记为从 10.11 开始的函数?
- 为什么我的C++代码中出现'Segmentation Fault: 11'行?
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- STLPort using C++11
- Qt 5.11.2 (Clang 8.0 (Apple), 64 位), 找不到 QJSEngine 文件
- 在 C++11 中,如何查找并返回以给定字符串开头的字符串向量中的所有项?
- C++11 迭代向量的新方法?