为什么 Clang 决定允许在 C++ 中使用指定的初始值设定项?

Why has Clang decided to allow designated initializers in C++?

提问人:Constantinos Glynos 提问时间:1/31/2019 更新时间:2/1/2019 访问量:3086

问:

我认为指定的初始值设定项在 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++ 是一个较旧的编译器这一事实来抨击这一点,但我不确定 tbh。

问题:

  1. 为什么 clang 决定允许指定的初始值设定项,而 g++ 和 vc++ 不允许?
  2. 这只是一个编译器错误还是有其他原因?
C++ 数组指定 初始值设定项

评论

0赞 StoryTeller - Unslander Monica 1/31/2019
“停产”是错误的表达方式。C++ 和 C 在被添加到 C 之前很久就已经分叉了。
0赞 Constantinos Glynos 1/31/2019
@StoryTeller:没有争论。我只是不知道该如何表达。“不受支持”会是一个更好的词吗?
3赞 Yksisarvinen 1/31/2019
@ConstantinosGlynos 否,VLA 不是C++。大多数编译器确实支持它们,但每个标准都无效。
1赞 t.niese 1/31/2019
你可以用它来让 clang 警告你,或者-Wc99-extensions-pedantic
1赞 StoryTeller - Unslander Monica 1/31/2019
编译器是由人们为人们编写的工具。因此,如果扩展有用,编译器将自行决定实现它。由开发人员决定他们是否要符合标准(以便他们的代码可以在其他编译器上编译),或者他们是否针对特定的工具链,因此使用其扩展来做一些很酷的事情。

答:

10赞 taskinoor 1/31/2019 #1

编译时会生成以下警告:-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

有趣的是,在搜索相关信息时,我在 Clang 页面中发现了 C++ 支持,其中“指定的初始值设定项”被列为通过即将到来的提案的扩展部分支持:

实验性地支持遵循 C++17 的 C++ 标准的一些拟议功能,暂定名为 C++2a

这是即将推出的标准的确切建议。因此,将来的 C++ 中可能会有指定的初始值设定项。

评论

0赞 Constantinos Glynos 1/31/2019
有没有办法在 g++ 和 vc++ 中启用 c99 扩展,看看它们是否会编译上面的代码?
0赞 taskinoor 1/31/2019
@ConstantinosGlynos 对不起,我不知道 g++ 或 vc++ 中的任何选项可以编译您发布的代码。也许其他人可以帮忙。