【问题标题】:What is the array initialization style in this code? Is it standard?这段代码中的数组初始化样式是什么?是标准的吗?
【发布时间】:2018-05-03 04:11:16
【问题描述】:

我遇到了一个源文件here(C 语言)。它使用一种合理但奇怪的风格来初始化一个数组。我在一个较短的 C++ 程序中试了一下(请注意代码注释中的“旧方式”):

arr.cc

#include <iostream>
using namespace std;

int main() {
    long arr[] = { [0] = 100, [1] = 101 }; // old way: long arr[] = { 100, 101 };
    cout << arr[0] << " " << arr[1] << endl;
}

代码编译如下:

g++-6 -std=c++14 arr.cc -o arr

运行时,输出如下:

100 101

它通过-std=c++14?但我在 cppreference.com 等 C++ 参考网站上找不到它。是否符合标准?如果有,是从哪个版本开始的?

【问题讨论】:

  • 不符合,是 GCC 扩展。
  • 使用-pedantic 编译并检查警告。 godbolt.org/g/rG3LXC 正如我所说,它是编译器供应商的扩展。
  • @DeiDei 刚试过 (-std=c++14 -pedantic -Wall).. 它通过了。仅供参考,我的 GCC 是 6.3.0。
  • 这种初始化语法是特定于 C 语言的。 C++ 目前不支持它(将来可能会支持)。 GCC 允许它在 C++ 代码中作为扩展。
  • 也许较旧的 GCC 版本不会发出警告,但是是的……指定的初始化程序是 GCC 恰好在 C++ 中支持的 C 特性。它不在任何 C++ 标准中。

标签: c++


【解决方案1】:

这不是有效的 C++ 代码; C 标准采用了它,作为扩展,GCC 也允许它在 C++ 中使用。要让 GCC 符合 C++ 标准,您需要同时传递 -std=c++17(或任何版本) -pedantic。有了这个,your code does emit warnings saying it's nonstandard。在 GCC 中如何工作的描述是 here


请注意,您也可以对struct 成员执行此操作,而不仅仅是数组;给定

struct Point
{
    int x;
    int y;
};

你可以说Point p = {.x = 17}。到目前为止,这在 C++ 中也是非标准的,但 it will be adopted in C++2a。到目前为止,这只适用于非数组版本;我不知道是否有计划添加数组版本,或者它是否会在 C++2a 中发生。

【讨论】:

    猜你喜欢
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 2010-12-19
    • 2012-06-04
    • 2021-06-17
    • 1970-01-01
    相关资源
    最近更新 更多