在C中是否有一个相当于sizeof()的东西?

应用于位域时,Sizeof()不起作用:

# cat pc #include int main( int argc, char **argv ) { struct { unsigned int bitfield : 3; } s; fprintf( stdout, "size=%d\n", sizeof(s.bitfield) ); } # gcc pc -op pc: In function 'main': pc:5: error: 'sizeof' applied to a bit-field 

…显然,因为它不能返回浮点部分大小或其他东西。 然而,它提出了一个有趣的问题。 在C中是否有一个等价物来告诉你变量/类型中的位数? 理想情况下,除了位域之外,它也适用于常规类型,如charint

更新:

如果对于位域没有相当于sizeof()的语言,那么计算它的最有效方法是什么 – 在运行时! 想象一下,你有依赖于此的循环,如果改变位域的大小,你不希望它们破坏 – 并且没有公平的作弊,并使位域大小和循环长度成为宏。 😉

您无法确定C中位字段的大小。但是,您可以使用limits.h中的CHAR_BIT值来查找其他类型的位大小。 位大小只是CHAR_BIT * sizeof(类型)。

不要假设C字节是八位字节,它至少是 8位。 实际的机器有16位甚至32位字节。

关于你的编辑:我会说一个位字段int a: n; 根据定义,其大小为n位。 放入struct时的额外填充位属于struct而不属于bit-field。

我的建议:不要使用位字段,而是使用(数组) unsigned char并使用位掩码。 这样很好地定义了很多行为(溢出,没有填充)。

使用sizeof()找不到位字段的大小是不可能的。 参见C99:

  • 6.5.3.4 The sizeof operator sizeof()显然不支持6.5.3.4 The sizeof operator ,位字段
  • 6.7.2.1 Structure and union specifiers这里的6.7.2.1 Structure and union specifiers澄清了位字段不是自立的成员。

否则,您可以尝试分配位字段成员-1u(设置了所有位的值),然后找到最高位的索引。 例如(未经测试):

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

man ffs更多。