4

C/C++ で、構造体型のダミー変数を定義せずに、構造体のメンバー変数のサイズを決定するにはどうすればよいですか? 間違った方法の例を次に示しますが、意図を示しています。

typedef struct myStruct {
  int x[10];
  int y;
} myStruct_t;

const size_t sizeof_MyStruct_x = sizeof(myStruct_t.x);  // error

参考までに、最初にダミー変数を定義する場合、これは「x」のサイズを見つける方法です。

myStruct_t dummyStructVar;

const size_t sizeof_MyStruct_x = sizeof(dummyStructVar.x);

ただし、「x」のサイズを取得するためだけにダミー変数を作成する必要がないようにしたいと考えています。0 を myStruct_t として再キャストしてメンバー変数 'x' のサイズを見つけるのに役立つ賢い方法があると思いますが、あまりにも長いので詳細を忘れてしまい、これについては適切な Google 検索を取得できないようです. あなたは知っていますか?

ありがとう!

4

6 に答える 6

11

次のマクロを使用しています。

#include <iostream>
#define DIM_FIELD(struct_type, field) (sizeof( ((struct_type*)0)->field ))
int main()
{
    struct ABC
    {
        int a;
        char b;
        double c;
    };
    std::cout << "ABC::a=" << DIM_FIELD(ABC, a) 
              << " ABC::c=" << DIM_FIELD(ABC, c) << std::endl;

    return 0;
}

トリックは、構造体へのポインタとして 0 を扱うことです。これはコンパイル時に解決されるため、安全です。

于 2009-09-09T16:27:04.473 に答える
3

これらのいずれかが機能するはずです。

sizeof(myStruct_t().x;);

また

myStruct_t *tempPtr = NULL;
sizeof(tempPtr->x)

また

sizeof(((myStruct_t *)NULL)->x);

sizeofは実行時ではなくコンパイル時に評価されるため、NULL ポインターの逆参照で問題が発生することはありません。

于 2009-09-09T16:26:12.760 に答える
2

C ++ 11では、これは。で実行できますsizeof(myStruct_t::x)。C ++ 11は、std :: declvalも追加します。これは、(とりわけ)これに使用できます。

#include <utility>
typedef struct myStruct {
  int x[10];
  int y;
} myStruct_t;

const std::size_t sizeof_MyStruct_x_normal = sizeof(myStruct_t::x);
const std::size_t sizeof_MyStruct_x_declval = sizeof(std::declval<myStruct_t>().x);
于 2012-08-29T14:04:00.087 に答える
0

私のユーティリティマクロヘッダーから:

#define FIELD_SIZE(type, field) (sizeof(((type *)0)->field))

次のように呼び出されます。

FIELD_SIZE(myStruct_t, x);  
于 2009-09-09T18:05:58.313 に答える