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

eru*_*orm 25 c sizeof bit-fields

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

# 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
Run Code Online (Sandbox Code Playgroud)

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

更新:

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

sch*_*hot 18

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

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

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

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

  • 什么时候这个愚蠢的`CHAR_BIT`论证最终会死?除了DSP和30多年前的传统大型机之外,`CHAR_BIT`是8. POSIX需要`CHAR_BIT == 8`,Windows与x86相关联,其中`CHAR_BIT == 8`,整个互联网和联网机器之间的互操作性是建立在八位字节上.除非你有一个非常不寻常的目标(在这种情况下你的代码可能不会是可移植的),所以即使考虑`CHAR_BIT!= 8`的可能性也绝对没有意义. (10认同)
  • @ Dummy00001:对不起,但你错了.C99标准为CHAR_BIT提供**下限**为8.并在附录J 3.4中明确指出**实现定义**行为*"一个字节中的位数."* (2认同)

Dum*_*001 5

使用 sizeof() 不可能找到位域的大小。参考C99:

  • 6.5.3.4 The sizeof operator, sizeof() 显然不支持位域
  • 6.7.2.1 Structure and union specifiers这里需要澄清的是,bit-field 不是独立成员。

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

s.bitfield = -1u;
num_bits = ffs(s.bitfield+1)-1;
Run Code Online (Sandbox Code Playgroud)

man ffs了解更多。