因此,结构可以有默认初始值设定项。据我所知,typedef应该不能。尽管如此,以下编译(C ++ 11,g ++ 5.4,6和7)。
typedef struct {
uint8_t foo[6] = {'M', 'A', 'R', 'K', 'E', 'R'};
uint8_t bar;
uint32_t baz;
} MyStruct;
编译器是否使用foo的默认初始值来定义和声明MyStruct类型的匿名结构?如果是这样,bar和baz是零初始化还是未初始化(CLion警告bar和baz未初始化,但我怀疑这是错误的)?这是未定义的行为,g ++扩展还是该语言的一个特性?
答案 0 :(得分:3)
据我所知,typedef不应该[具有默认初始值设定项]。
typedef
只是一种类型的别名。它可以为具有默认成员初始值设定项的类型添加别名。
typedef struct {
uint8_t foo[6] = {'M', 'A', 'R', 'K', 'E', 'R'};
uint8_t bar;
uint32_t baz;
} MyStruct;
struct {...}
是结构(即类)的定义。结构定义在typedef定义中。
编译器是否使用默认初始值来定义和声明匿名结构...?
是。结构可以有默认的成员初始值设定项。结构是否未命名或命名是无关紧要的。
这是未定义的行为,g ++扩展还是该语言的功能?
这是明确定义的标准功能。
奇怪的是,C ++ 11添加的默认成员初始化程序如何允许非默认构造成员的非默认结构(即类) - 因为成员初始化程序的早期唯一位置是构造函数的成员初始化列表,并且没有声明为未命名的struct声明构造函数的语法。