【问题标题】:Naming standards for C unionsC 联合体的命名标准
【发布时间】:2014-11-06 13:05:48
【问题描述】:

我有时会使用联合以不同方式访问相同类型的数据。例如这个联合:

typedef union {
   int64 word;
   int32 array[2];
   struct {
      field4:16;
      field3:16;
      field2:28;
      field1:4;
   } bit;
} my_type;

此解决方案是否一致正确,我使用的名称(单词、数组、位)是否有任何标准?

这个解决方案的缺点是我得到了繁琐的符号:

   my_type data;
   data.bit.field1 = 0xA;
   for(i=0;i<sizeof(my_t);i++)
      data.array[i]++;

【问题讨论】:

  • name _t 已保留,请勿使用。
  • @2501 它是由什么保留的?我怎么知道它是一个类型而不是一个变量?
  • 至少在某种程度上:stackoverflow.com/questions/10356626/…
  • @coin POSIX 标准为自己保留所有以 _t 结尾的类型名称。这使得 POSIX 可以在不破坏现有代码的情况下引入新类型(名称以 _t 结尾)。
  • 注意:大于 int/unsigned 宽度的字段宽度不是 100% 可移植的。由于int 必须至少为16 位,28 可能是一个问题。

标签: c data-structures struct


【解决方案1】:

一些编译器允许在联合中省略结构的名称。您可以尝试将您的类型定义为:

typedef union {
   int64 word;
   int32 array[2];
   struct {
      field4:16;
      field3:16;
      field2:28;
      field1:4;
   } bit;
} my_type;

这允许访问位成员更容易一点:

my_type data;
data.field1 = 0xA;

但不幸的是,这取决于编译器和编译器选项。 编辑: C11 标准 draft 将其描述为匿名结构。

【讨论】:

  • 此功能已与 C11 集成到标准中。分别称为匿名结构和联合成员。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-21
  • 1970-01-01
  • 1970-01-01
  • 2013-09-08
相关资源
最近更新 更多