web-dev-qa-db-ja.com

Cにsizeof()に相当するものはありますか?

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

...明らかに、浮動小数点の部分的なサイズなどを返すことはできません。しかし、それは興味深い質問を提起しました。 Is Cには、変数/型のビット数を示す同等のものがありますか?理想的には、charintのような通常の型でも機能します。 -)、ビットフィールドに加えて。

更新:

ビットフィールドにsizeof()に相当する言語がない場合、実行時にそれを計算する最も効率的な方法は何ですか?これに依存するループがあり、ビットフィールドのサイズを変更してもループが壊れたくないと想像してください。公平な不正行為がなく、ビットフィールドのサイズとループの長さがマクロになっています。 ;-)

26
eruciform

Cのビットフィールドのサイズを決定することはできません。ただし、limits.hにあるCHAR_BITの値を使用して、他のタイプのビットのサイズを確認することはできます。ビット単位のサイズは、単にCHAR_BIT * sizeof(タイプ)です。

Cバイトがオクテットであると想定しないでください。少なくとも 8ビットです。 16ビットバイトまたは32ビットバイトの実際のマシンがあります。

編集に関して:ビットフィールドint a: n;のサイズはn定義上ビットです。構造体に配置されたときの余分なパディングビットは、ビットフィールドではなく構造体に属します。

私のアドバイス:ビットフィールドは使用せず、unsigned char(の配列)を使用してビットマスクを操作します。このようにして、多くの動作(オーバーフロー、パディングなし)が明確に定義されます。

18
schot

Sizeof()を使用してビットフィールドのサイズを見つけることは不可能です。 C99を参照してください。

  • 6.5.3.4 The sizeof operator、ビットフィールドは明らかにsizeof()でサポートされていません
  • 6.7.2.1 Structure and union specifiersここで、ビットフィールドは自立型メンバーではないことが明確にされています。

それ以外の場合は、ビットフィールドメンバー-1u(すべてのビットが設定された値)に割り当てて、最上位ビットのインデックスを見つけることができます。例えば。 (未テスト):

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

man ffs 詳細については。

4
Dummy00001