尽管更新,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,但格式仍会摆动

尽管对 Web 配置和主机工厂进行了更改,但仍会出现 WCF 错误

CentOS 安装 clang

在mac上编译C++11代码?

Qt 图形被另一个图形遮挡,但仍会导致绘图更新