18

C11 标准中添加了匿名结构,因此

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

是有效和标准的。使用 typedef 代替完整的结构声明是否也在标准范围内?例如:

typedef struct { 
    int a, b;
} ab_struct;

typedef struct { 
    ab_struct;
    int c; 
} abc_struct;

GCC 文档说这是一个 Plan 9 扩展,但是它可以在我尝试过的几个编译器中工作(包括 GCC ......)。通过我对标准本身的阅读,我认为这还可以,但这是一种很容易搞砸的仔细阅读。

4

3 回答 3

13

这显然是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, Anonymous Structures (N1425)

于 2012-02-04T16:23:35.880 回答
4

-fplan9-extensions实际上,您的第二个片段充满了危险,并且在没有在 gcc 中明确指定的情况下不等同于第一个片段。

特别是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;没有-fplan9-extensio.

而使用顶部代码段,您的匿名结构将按照您的想法工作。即:

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


int main() {
    abc_struct abc;
    abc.a = 5;
    return 0;
}
于 2012-02-04T16:48:39.067 回答
0

好吧,恐怕我还没有费心得到最终的标准,但最终草案是这样说的:

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

我只能将其解释为,struct {};并且union {};可以是匿名结构/联合。

于 2012-02-04T16:22:57.783 回答