【问题标题】:C11 anonymous structs via typedefs?C11 通过 typedefs 匿名结构?
【发布时间】:2012-02-04 15:59:08
【问题描述】:

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 ......)。通过阅读标准本身, 我认为没关系,但这是一种很容易搞砸的细读。

【问题讨论】:

    标签: c struct c11


    【解决方案1】:

    这显然是 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 中提出,请参阅 5.28 SC22WG14.12205,匿名结构 (N1425) in http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1490.pdf

    【讨论】:

      【解决方案2】:

      实际上,您的第二个 sn-p 充满危险,如果没有在 gcc 中明确指定 -fplan9-extensions,则不等同于第一个。

      特别是ab_struct;第 6 行的声明什么都不做(根据 gcc 警告)。只需在 foo.c 中粘贴第二个 sn-p 即可生成:

      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;
      }
      

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

      而使用顶部 sn-p 您的匿名结构将按照您的想法工作。即:

      typedef struct { 
          struct { 
                  int a, b;
          };
              int c; 
      } abc_struct;
      
      
      int main() {
          abc_struct abc;
          abc.a = 5;
          return 0;
      }
      

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2018-03-28
          • 2023-03-04
          • 2018-01-27
          • 1970-01-01
          • 2012-02-14
          • 2012-01-27
          • 2015-03-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多