c++ - 尽管有更新,clang 还是产生了关于 c++11 的警告

标签 c++ c++11 clang clang++

最近更新了 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 错误),但警告是为了通知你,如果你如果编译为 C++98,那么它将无法工作。

如果您不打算将代码构建为 C++98,那么此警告对您没有任何值(value),您应该简单地禁用它。

我相信在最新版本中也有一个 -Wc++11-compat 标志,因为 clang 支持(可能会被称为)C++14。

关于c++ - 尽管有更新,clang 还是产生了关于 c++11 的警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21899028/

相关文章:

c++ - 如何通过参数包参数设置 std::array 大小?

c++ - 使用 complex<double> 的函数式转换的模糊转换

c++ - CreateProcess + 调用命令行工具

c++ - 编译器构造 : Handle references to unordered symbols

c++ - 在 shinyapp.io 的 R Shiny 应用程序中使用 C++ 编译代码

c++ - 模 : The Purpose of An Undefined Integer

c++ - make_shared如何为manager object和managed object分配单个动态内存

c++ - 使用 64 位包编译 32 位 Qt 应用程序

c++ - 警告 : returning reference to local temporary object

c - 是否有任何编译器/预处理器技巧来调试打印枚举名称?