初始化结构的指定初始化

时间:2013-10-09 12:36:20

标签: c++ c struct

我知道我可以使用指定的初始化程序初始化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 ++模式下工作)。

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:4)

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

但是,某些编译器可能会在C ++中支持这些功能作为扩展。例如,gcc在C ++中支持复合文字,但不支持指定初始化程序。看起来您的编译器也是如此。

答案 2 :(得分:2)

Designated Initializers是一个 C99 功能,但似乎clanggcc支持 C ++ 作为扩展,尽管gcc doc另有说法。如果我使用clang标记-pedantic进行构建,则会显示:

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

gcc发出警告:

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

C ++ 中,我们有一些构造函数,可以让你以更干净的方式初始化 struct

第二个示例使用Compound Literals,这也是 C99 功能,支持作为扩展。