• ベストアンサー

構造体のメンバーの静的なサイズ取得

構造体のメンバーをヘッダーファイル中で得たい場合、 以下のような方法以外になにか方法はないでしょうか? 単純に XXXX x;と宣言してそれを sizeof(x.chwk)と 使うというような方法以外で なにかあれば教えてください。 ---------------------------------------- typedef struct { char chwk[100]; } XXXX; typedef struct { char chwk[ sizeof(( (XXXX*)0)->chwk ) ]; } YYYY; main(int arc, char *arg[] ){ YYYY y; printf( " YYYY chwk size = %d\n", sizeof(y.chwk)); }

質問者が選んだベストアンサー

  • ベストアンサー
  • 1839cc
  • ベストアンサー率54% (12/22)
回答No.4

う~ん・・・ 質問者さんの方法をマクロ関数にした#1さんの方法がベストじゃないかなぁと思います。 offsetof マクロの実装でも NULL ポインタはよく利用されていますしね。 ちなみに、C++でなら通ってもよさそうな sizeof(XXXX::chwk) でもダメみたいですね。 まぁ、クラス変数ではないのだから、当然かも知れませんが。

ritomo
質問者

お礼

ご回答ありがとうございます。 >offsetof マクロの実装でも NULL ポインタはよく利用されていますしね。 そうでしたか。 私は不勉強で初めて知りました。 >C++でなら通ってもよさそうな sizeof(XXXX::chwk) でもダメみたいですね。 そうみたいですね。 ありがとうございました。

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

意味もなく「100」という数値がこんなところに出てくるのがそもそもおかしいです. 普通は記号定数として #define されているはずなので, それを使うのが普通でしょう. 結果的には #4 と同じですが.

ritomo
質問者

お礼

回答ありがとうございます。 ご指摘ごもっともです。 わざわざこんな書き方をしたのは#4 の「お礼」の通りです

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.2

>構造体のメンバーの静的なサイズ 静的なんですよね?わざわざ、 typedef struct { char chwk[100]; } XXXX; typedef struct { char chwk[ sizeof(( (XXXX*)0)->chwk ) ]; } YYYY; こんなことしなくても、 今回提示されたコードの場合なら #define MAXCHWKLEN (100) または、 const int MAXCHWKLEN = 100; typedef struct { char chwk[MAXCHWKLEN]; } XXXX; typedef struct { char chwk[MAXCHWKLEN]; } YYYY; でいいのではないでしょうか?

ritomo
質問者

お礼

回答ありがとうございます。 ご指摘ごもっともです。 説明が重複しますが、DEFINEとか使う以外に単純に メンバーのサイズを求める方法が知りたかったものですから。

  • noocyte
  • ベストアンサー率58% (171/291)
回答No.1

そのソースの中にも書かれている sizeof(((XXXX*)0)->chwk) をマクロ化して, #define MemberSizeOf(type, member) sizeof(((type*)0)->member) MemberSizeOf(XXXX, chwk) ではご不満ですか?

参考URL:
http://www5d.biglobe.ne.jp/~noocyte/Programming/CMacros.html#MemberSizeOf
ritomo
質問者

お礼

回答ありがとうございます。 実体にNULLを使うところが自分で納得いかなくて でもDEFINEとか使う以外に単純に メンバーのサイズを求める方法が知りたかったものですから。

ritomo
質問者

補足

やはりこの方法になりそうですね。 ありがとうございました。