初始化结构的指定初始化

Designated initialization of initialized struct

本文关键字:初始化 结构      更新时间:2023-10-16

我知道我可以使用指定的初始值设定项初始化 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中引入的,C++尚不支持它们。

但是,某些编译器可能会在C++中支持这些功能作为扩展。例如,gcc 支持C++中的复合文本,但不支持指定的初始值设定项。似乎您的编译器也这样做。

指定初始值设定项是 C99 的一项功能,但它似乎clanggcc C++中支持它们作为扩展,尽管 gcc 文档另有声明。如果我使用 -pedantic 标志与clang构建它,它说:

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

gcc警告:

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

在C++我们有构造函数,它允许您以更简洁的方式初始化结构

第二个示例使用复合文本,这也是支持作为扩展的 C99 功能。