初始化结构的指定初始化

我知道我可以使用指定的初始化程序初始化C99中的结构,如下所示:

typedef struct { char a; char b; int c; } MyStruct; MyStruct s = {.a = 1, .b = 2, .c = 3}; 

(该代码在我的c ++编译器中不起作用,但(俄语)维基百科说它应该)

但是对于一些奇怪的原因,这样的代码也会编译(并按预期工作):

 typedef struct { char a; char b; int c; } MyStruct; MyStruct arr[5]; int main(void) { arr[0] = (MyStruct){.a = 1, .b = 2, .c = 0x332211}; } 

我认为初始化应该只在创建对象时才有效,而不是之后。

这是正常的行为还是某种编译怪癖? 它应该在C ++中工作吗? 花括号中究竟是什么东西? 某种临时无名结构? 我正在使用Keil uVision 4(并且指定的初始化程序不能在c ++模式下工作)。

指定的初始化程序是C构造,它们不是C ++的一部分。 所以C ++编译器在拒绝代码时是正确的,并且在两种情况下都应该这样做。

第二个构造是“复合文字”,也是C特征,它不是C ++的一部分。 所以C ++编译器应该拒绝它,而C99(或更新的)编译器应该接受这两个片段。

在C99中引入了Designated Initializer (在第一个示例中)和Compound Literals (在第二个示例中),C ++还不支持它们。

但是,某些编译器可能会在C ++中支持这些function作为扩展。 例如,gcc支持C ++中的Compound Literals ,但不支持Designated Initializer 。 看起来您的编译器也是如此。

指定的初始化程序是一个C99function,但似乎clanggcc支持它们在C ++中作为扩展,尽管gcc doc声称不是这样。 如果我使用-pedantic标志使用clang构建它,它会说:

 warning: designated initializers are a C99 feature [-Wc99-extensions] 

gcc警告:

  warning: ISO C++ does not allow C99 designated initializers [-Wpedantic] 

C ++中,我们有构造函数,它允许您以更干净的方式初始化结构

第二个示例使用复合文字 ,这也是作为扩展支持的C99function。