为什么在初始化这个结构体时,我需要更多的花括号?

5

一开始我尝试着初始化了一个像这样的结构体:

struct {
    char age[2];        // Hold two 1-Byte ages
} studage[] = {
    {23, 56},
    {44, 26}
};

但是这会导致编译器警告缺少大括号,所以我按照编译器的建议使用了更多的大括号,最终得到了下面的代码:

struct {
    char age[2];        // Hold two 1-Byte ages
} studage[] = {
    {{23, 56}},
    {{44, 26}}
};

没有警告。为什么需要额外的大括号?


5
外层的是用来表示结构体,内层的是表示其中的字符数组吗? - Wookie88
这是一个警告,而不是错误。编译器并未“要求”什么。 - user3920237
目前还不相关,可能只有在处理古老事物的年龄时才会涉及到,但在C语言中,char类型根据平台的不同可以是signedunsigned。更安全的做法是使用unsigned char(除非你正在处理一些根据某些物理模型可以具有负年龄的负能量反粒子)。 - Bathsheba
§6.7.9/30说:“请注意,完全带括号和最小带括号的初始化形式通常较少会引起混淆。” - user3920237
1个回答

10

您有一个结构体数组,该结构体有一个成员是一个数组。

struct {
    char age[2];        // Hold two 1-Byte ages
} studage[] = {
              ^ 
         This is for the studage array
    { { 23, 56}},
    ^ ^ 
    | this is for the age array
  this is for the anonymous struct

    {{44, 26}}
};

也许如果你的结构体有另一个成员会更容易理解:

struct {
        int id;
        char age[2];
    } studage[] = {
        {1, {23, 56}},
         ^   ^    ^
         id  |    | 
           age[0] |
                 age[1]
     };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接