【问题标题】:C++ Array Initializers WarningsC++ 数组初始化器警告
【发布时间】:2014-08-15 04:03:55
【问题描述】:

我已经在一个类中声明并初始化了一个常量 char 数组:

class grid {
    const char test[11] = {'s', 'e', '1', '2', '3', '4', '5', '6', '7', '8', '9'};

我的代码有效,但我不断收到编译器警告:

非静态数据成员初始化器仅适用于 C++11

扩展初始化列表仅适用于 C++11

我知道这不是问题,因为我正在编译为 C++11 标准,但我很好奇我的代码在 C++11 之前是什么。

我希望有人能给我一些见解,并建议我可以做些什么来使这段 C++98 代码“友好”。

也应要求,我的编译器命令:

> g++ -o test main.cpp

【问题讨论】:

  • 您是否在编译器命令行中添加了-std=c++11
  • 警告中为[默认启用]
  • 要成为 C++98 的“友好”,就像你所说的那样,不要在类声明中初始化你的类数据成员;而是在类构造函数中执行此操作。
  • Enabled by default表示警告默认开启,与-std=c++11无关。如果您启用了 C++11 模式,则不应出现此警告。 C++03 只允许在类中初始化常量整数静态数据成员。您正在使用称为非静态数据成员初始化程序的 C++11 功能。
  • 您不能在 C++98 的构造函数中初始化数组。除非你调用分配给元素初始化。

标签: c++ arrays warnings initializer


【解决方案1】:

为了使其与 C++98 兼容,您需要在类声明之外初始化非静态类常量。

【讨论】:

    【解决方案2】:

    您需要使用-std=c++11 进行编译(对于gccclang)。如果您不这样做,则会检查您的程序是否与旧的 C++98 标准相比较,以确保与旧的编译器兼容。

    因此它允许您在没有标志的情况下使用 C++11 功能,但会警告您,以免您意外这样做。

    进一步说明:

    您的代码编译得很好,因为它是合法代码并且编译器可以编译它。编译器省略了一个警告,让您意识到您使用了 C++11 功能这一事实,因为许多人(如我的大学,遗憾的是)仍然使用过时的编译器,如 gcc4.6,它没有完整的 C++11 支持。这意味着这些人可能无法编译您可能关心的代码(例如,如果您的教授需要编译您的作业)。

    使用-std=c++11 标志告诉编译器“这是一个 C++11 程序,旨在使用符合 C++11 的编译器进行编译”。因此,警告变得多余。

    【讨论】:

    • 在问题中,我知道用 c++11 编译它可以解决这个问题。我对它发生的方式和原因更感兴趣。
    • @Rhys 已编辑,希望对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多