【发布时间】:2019-01-31 11:31:05
【问题描述】:
我认为指定的初始化程序在 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++ 是一个较旧的编译器这一事实,但我不确定。
问题:
- 为什么当 g++ 和 vc++ 不允许时,clang 决定允许指定初始值设定项?
- 这只是编译器错误还是有其他原因?
【问题讨论】:
-
“停产”是错误的说法。 C++ 和 C 在被添加到 C 之前很久就已经分叉了。
-
@StoryTeller:没有争论。我只是不知道如何表达。 “不支持”会是一个更好的词吗?
-
@ConstantinosGlynos 不,VLA 不是 C++。大多数编译器都支持它们,但不是每个标准都有效。
-
您可以使用
-Wc99-extensions让 clang 警告您或使用-pedantic -
编译器是人们为人们编写的工具。因此,如果一个扩展有用,编译器将自行决定实现它。由开发人员决定他们是否要符合标准(以便他们的代码可以在其他编译器上编译),或者他们是否针对特定的工具链并使用其扩展来做一些很酷的事情。
标签: c++ arrays designated-initializer