初始化结构体的指定初始化

Posted

技术标签:

【中文标题】初始化结构体的指定初始化【英文标题】:Designated initialization of initialized struct 【发布时间】:2013-10-09 12:36:20 【问题描述】:

我知道我可以使用指定的初始化程序在 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++)吗? @YuHao 我的编译器是 Keil uVision(我已经在上面写过) 这些是指定的初始化器与复合文字相结合。它在 C 中有效,而不是 C++。 LINK @Amomum:我看不懂俄语,但我没有在该页面上看到任何指定初始化程序的示例。 English version 正确地将它们提到为 C++ 中不存在的 C 构造。 【参考方案1】:

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

第二个构造是“复合文字”,也是一个不属于 C++ 的 C 特性。所以 C++ 编译器应该拒绝它,而 C99(或更新的)编译器应该接受这两个 sn-ps。

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

Designated Initializers 是一个C99 功能,但似乎clanggccC++ 中支持它们作为扩展,尽管gcc 文档声称并非如此.如果我使用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 功能,支持作为扩展。

【讨论】:

以上是关于初始化结构体的指定初始化的主要内容,如果未能解决你的问题,请参考以下文章

自定义类型详解

C基础结构体

结构体的初始化(构造函数)

结构体及共用体的初始化方法

深度剖析结构体@自定义类型1---结构体的声明,自引用,变量定义和初始化 + 结构体内存对齐 + 结构体传参 + 结构体实现位段

C语言 结构体和共用体的初始化