为什么typedef结构允许默认初始值设定项?

时间:2018-01-25 00:29:43

标签: c++ c++11 struct initialization typedef

因此,结构可以有默认初始值设定项。据我所知,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 ++扩展还是该语言的一个特性?

1 个答案:

答案 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声明构造函数的语法。