初始化结构体的指定初始化
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 功能,但似乎clang
和gcc
在C++ 中支持它们作为扩展,尽管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 功能,支持作为扩展。
【讨论】:
以上是关于初始化结构体的指定初始化的主要内容,如果未能解决你的问题,请参考以下文章
深度剖析结构体@自定义类型1---结构体的声明,自引用,变量定义和初始化 + 结构体内存对齐 + 结构体传参 + 结构体实现位段