【问题标题】:Why has Clang decided to allow designated initializers in C++?为什么 Clang 决定在 C++ 中允许指定初始化器?
【发布时间】: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++ 是一个较旧的编译器这一事实,但我不确定。

问题:

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

【问题讨论】:

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

标签: c++ arrays designated-initializer


【解决方案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

有趣的是,在搜索相关信息时,我发现了 C++ Support in Clang 页面,其中“指定的初始化程序”被列为通过扩展对即将提出的提案部分支持:

对 C++17 之后的 C++ 标准的一些提议特性的实验性支持,临时命名为 C++2a

This 是即将推出的标准的确切提议。所以在未来的 C++ 中可能会有指定的初始化器。

【讨论】:

  • 有没有办法在 g++ 和 vc++ 中启用 c99-extensions 看看它们是否会编译上面的代码?
  • @ConstantinosGlynos 抱歉,我不知道 g++ 或 vc++ 中有任何选项可以编译您发布的代码。可能是其他人可以提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-14
  • 2018-04-22
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多