1

これが私のコードです..

#include <stdio.h>

struct new {
    unsigned short b0 = 0;
    unsigned short b1 = 0;
    unsigned short b2 = 0;
    unsigned short b3 = 0;
    unsigned short b4 = 0;
    unsigned short b5 = 0;
    unsigned short b6 = 0;
    unsigned short b7 = 0;
};

int main()
{
    printf("Bit Field Example\n");
    struct new b; //Seems wrong to me
    int result = sizeof(b)/sizeof(*b); //Seems wrong to me
    printf("Size: %d\n", result);
    return 0;
}

上記のコードをコンパイルするためにLinuxマシンを使用しています。下の行が間違っていることは知っています..

int result = sizeof(b)/sizeof(*b);

しかし、他のテクニックについてはわかりません。まず、構造内の要素の総数を数えることはできますか? やり方のコツを教えてください。

前もって感謝します。

4

4 に答える 4

5

移植性、一般的、または安全ではありません。

コンパイラはアラインメントやその他の理由でパディングを追加する可能性があり、サイズが大きくなる可能性があるため、値が正しいことに依存することはできません。

要素数が重要な場合は、配列を使用することをお勧めします。

ちなみに、このコード:

int result = sizeof(b)/sizeof(*b);

間違っていてコンパイルできません。bはポインターで*bはないため、有効な式ではありません。あなたが意味したのは:

const int result = sizeof b / sizeof b.b0;

また、補足として、C コードで C++ キーワードを使用しないでください。多少混乱する可能性があります。

更新「ビットフィールド」への言及がわかりません。それらは次のようになり、構造体でのみ発生します。

struct strawberry {
  unsigned short fields : 10;
  unsigned short forever : 6;
};

繰り返しますが、バイト サイズさえないため、それらを数えることはできません。でも一方で、フィールドごとのビット幅も含めて定義を書いているのですから、いくつあるかはわかるはずですよね?

于 2013-04-04T11:29:23.553 に答える
3

の使用は、構造体ではなく配列sizeof(x) / sizeof(*x)に使用されます。構造体は可変サイズではないため、コンパイル時にすべてのフィールドが固定されるため、要素数を計算する必要はまったくありません。

構造体にあるフィールドの数を知りたい場合は、自分で数えなければなりません。

于 2013-04-04T11:32:40.823 に答える
1

C は静的に型付けされているため、実行時にこれを行うことはできません。したがって、唯一の方法はマクロを使用することです。マクロは、コンパイル時にこの番号を生成できます。別の投稿でこれを行う方法を示しました。

基本的な考え方は、X_MACROを使用して、構造体メンバーで何かを実行できる特別な X 関数を定義できるようにすることです。

于 2016-07-18T03:05:17.377 に答える
-1

構造内の要素数のカウントが必要な場合は次のとおりです。

struct tag=&p;

p++ をインクリメントし、毎回カウントをインクリメントしてカウントを出力する場合:

p++;

if(i=o;i<arr[i];i++)

count++;
printf("%d",count);

正しいと思います。

于 2013-12-05T06:35:31.213 に答える