为什么Clang决定允许在C ++中使用指定的初始化程序?

时间:2019-01-31 11:31:06

标签: c++ arrays designated-initializer

我认为指定的初始值设定项在C ++中已终止,仅在C语言中有效。但是,我遇到了一个简单的示例,该示例在clang ++中进行了编译并可以很好地工作。

f(int, float)

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. 为什么在g ++和vc ++不允许的情况下clang决定允许指定的初始化程序?
  2. 这只是一个编译器错误,还是还有其他原因?

1 个答案:

答案 0 :(得分:6)

使用-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 ++ 2a的C ++标准的某些提议功能的实验支持

This是即将发布的标准的确切建议。因此,将来的C ++中可能会指定初始化器。