代码之家  ›  专栏  ›  技术社区  ›  eruciform

在C语言中是否有一点与sizeof()等价?

  •  23
  • eruciform  · 技术社区  · 15 年前

    # cat p.c
      #include<stdio.h>
      int main( int argc, char **argv )
      {
        struct { unsigned int bitfield : 3; } s;
        fprintf( stdout, "size=%d\n", sizeof(s.bitfield) );
      }
    # gcc p.c -o p
      p.c: In function ‘main’:
      p.c:5: error: ‘sizeof’ applied to a bit-field
    

    …显然,因为它不能返回浮点部分大小之类的。然而,它提出了一个有趣的问题。 烧焦 内景 ,除了位字段。

    更新:

    如果位域没有sizeof()的语言等价物,那么在运行时计算它的最有效方法是什么!假设你有依赖于此的循环,如果你改变了位域的大小,你不想让它们中断——而且没有公平的欺骗,让位域大小和循环长度成为一个宏

    2 回复  |  直到 15 年前
        1
  •  22
  •   schot    15 年前

    不能确定C中位字段的大小。但是,您可以通过使用 CHAR_BIT ,在极限中发现。位的大小很简单 *sizeof(类型)。

    至少

    我想说是有点野 int a: n; n 比特的定义。当放入结构时,额外的填充位属于结构而不是位字段。

    unsigned char 使用比特面具。这样,很多行为(溢出、无填充)都得到了很好的定义。

        2
  •  4
  •   Dummy00001    15 年前

    • 6.5.3.4 The sizeof operator ,sizeof()显然不支持位字段
    • 6.7.2.1 Structure and union specifiers

    s.bitfield = -1u;
    num_bits = ffs(s.bitfield+1)-1;
    

    man ffs 更多。

    推荐文章