在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中是否有一个等价物来告诉你变量/类型中的位数? 理想情况下,除了位域之外,它也适用于常规类型,如char和int 。
更新:
如果对于位域没有相当于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
更多。