c++ - 为什么 Clang 决定允许在 C++ 中指定初始化器?

标签 c++ arrays designated-initializer

我认为指定初始化程序在 C++ 中已停用,只能在 C 中使用。但是,我遇到了一个简单的示例,该示例在 clang++ 中编译并运行良好。

int main()
{
    int a[6] = { [4] = 29, [2] = 15 };
}

g++: https://rextester.com/AXIZ79197 (错误)

clang ++:https://rextester.com/UYVHHP56966 (作品)

VC++:https://rextester.com/UCBEU10658 (错误)

g++ 和 vc++ 都无法编译,而 clang++ 工作得很好。另外值得一提的是,g++和vc++给出了不同的错误信息。 vc++ 将指定的初始值设定项与 lambda 表达式混淆了。我想我可以将此归咎于 g++ 是一个较旧的编译器这一事实,但我不确定。

问题:

  1. 为什么 clang 决定允许指定初始化程序,而 g++ 和 vc++ 却不允许?
  2. 这只是一个编译器错误还是有其他原因?

最佳答案

当使用 -pedantic 编译时会生成这些警告:

source_file.cpp:3:18: warning: designated initializers are a C99 feature [-Wc99-extensions]
    int a[6] = { [4] = 29, [2] = 15 };
                 ^~~~~~~~
source_file.cpp:3:28: warning: designated initializers are a C99 feature [-Wc99-extensions]
    int a[6] = { [4] = 29, [2] = 15 };

显然 clang++ 默认启用 c99-extensions

这不是错误,因为编译器可能会选择提供额外的功能。 clang++ 开发人员只是决定让它保持启用状态。如果我们不需要这些功能,最好使用 -pedantic

有趣的是,在搜索相关信息时,我遇到了 C++ Support in Clang “指定初始化器”被列为通过即将到来的提案的扩展部分支持的页面:

experimental support for some proposed features of the C++ standard following C++17, provisionally named C++2a

This是即将到来的标准的确切建议。所以在未来的 C++ 中可能会有指定的初始化程序。

关于c++ - 为什么 Clang 决定允许在 C++ 中指定初始化器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54459635/

相关文章:

c++ - 如何在qlistWidget中模拟双击item

c++ - 除以零后无运行时错误

javascript - Javascript 数组中的循环

c++ - 密码破解代码优化;

c - 点 (.) 在结构初始值设定项中是什么意思?

c++ - 为什么 sublime text 和 VSCode 不显示运行时错误?

c++ - Rapidjson 根本不编码 utf8 序列

c - 如何将字符串标记输入二维数组?

使用 C99 进行 C 结构初始化 - 混合命名和未命名成员是否有效?