C11匿名结构通过typedef?

时间:2012-02-04 15:59:08

标签: c struct c11

C11标准中添加了匿名结构,所以

typedef struct { 
    struct {int a, b};
    int c; 
} abc_struct;

是有效且标准的。使用typedef代替完整的struct声明是否也在标准范围内? E.g:

typedef struct { 
    int a, b;
} ab_struct;

typedef struct { 
    ab_struct;
    int c; 
} abc_struct;

海湾合作委员会的文件说,这是一个Plan 9扩展,但它可以在 我尝试过的编译器很少(包括GCC ......)。通过我阅读标准本身, 我认为没关系,但这是一种容易搞砸的近距离阅读。

3 个答案:

答案 0 :(得分:10)

gcc团队的约瑟夫·迈尔斯(Joseph S. Myers)向C委员会提出了一个问题。答案是否定的,它在C11中无效。

见答案:

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1549.pdf

迈尔斯的评论:

  

根据N1549,本周的伦敦WG14会议同意不允许使用typedef声明匿名结构和联合字段。

来源http://gcc.gnu.org/ml/gcc-patches/2011-03/msg01151.html

SC22WG15.12205中提出的问题请参阅http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1490.pdf中的 5.28 SC22WG14.12205,匿名结构(N1425)

答案 1 :(得分:4)

实际上你的第二个片段充满了危险,并没有明确指定gcc中-fplan9-extensions的第一个片段。

特别是ab_struct;第6行的声明没有(根据gcc警告)。只需在foo.c中粘贴第二个片段即可生成:

foo.c:6: warning: declaration does not declare anything

特别是如果你要尝试:

typedef struct { 
    int a, b;
} ab_struct;

typedef struct { 
    ab_struct;
    int c; 
} abc_struct;


int main() {
    abc_struct abc;
    abc.a = 5;
    return 0;
}

如果没有abc.a = 5;,您将在第13行-fplan9-extensio上收到语法错误。

然后使用顶部代码段,您的匿名结构将按照您的想法运行。即:

typedef struct { 
    struct { 
            int a, b;
    };
        int c; 
} abc_struct;


int main() {
    abc_struct abc;
    abc.a = 5;
    return 0;
}

答案 2 :(得分:0)

好吧,我担心我还没有费心去完成标准,但这是最终草案的内容:

  • 一个未命名的成员,其类型说明符是一个没有标记的结构说明符,称为匿名结构;一个未命名的成员,其类型说明符是一个没有标记的联合说明符,称为匿名联合。

我只能解释为只有struct {};union {};可以是匿名结构/联合。