我知道我可以使用指定的初始化程序初始化C99中的结构,如下所示:
typedef struct
{
char a;
char b;
int c;
} MyStruct;
MyStruct s = {.a = 1, .b = 2, .c = 3};
Run Code Online (Sandbox Code Playgroud)
(该代码在我的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};
}
Run Code Online (Sandbox Code Playgroud)
我认为初始化应该只在创建对象时才有效,而不是之后.
这是正常的行为还是某种编译怪癖?它应该在C++中工作吗?花括号中究竟是什么东西?某种临时无名结构?我正在使用Keil uVision 4(并且指定的初始化程序不能在c ++模式下工作).
指定的初始化程序是C构造,它们不是C++的一部分.所以C++编译器在拒绝代码时是正确的,并且在两种情况下都应该这样做.
第二个构造是"复合文字",也是C特征,它不是C++的一部分.所以C++编译器应该拒绝它,而C99(或更新的)编译器应该接受这两个片段.