- ベストアンサー
構造体のメンバーの静的なサイズ取得
構造体のメンバーをヘッダーファイル中で得たい場合、 以下のような方法以外になにか方法はないでしょうか? 単純に 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)); }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
う~ん・・・ 質問者さんの方法をマクロ関数にした#1さんの方法がベストじゃないかなぁと思います。 offsetof マクロの実装でも NULL ポインタはよく利用されていますしね。 ちなみに、C++でなら通ってもよさそうな sizeof(XXXX::chwk) でもダメみたいですね。 まぁ、クラス変数ではないのだから、当然かも知れませんが。
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
意味もなく「100」という数値がこんなところに出てくるのがそもそもおかしいです. 普通は記号定数として #define されているはずなので, それを使うのが普通でしょう. 結果的には #4 と同じですが.
お礼
回答ありがとうございます。 ご指摘ごもっともです。 わざわざこんな書き方をしたのは#4 の「お礼」の通りです
- aris-wiz
- ベストアンサー率38% (96/252)
>構造体のメンバーの静的なサイズ 静的なんですよね?わざわざ、 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; でいいのではないでしょうか?
お礼
回答ありがとうございます。 ご指摘ごもっともです。 説明が重複しますが、DEFINEとか使う以外に単純に メンバーのサイズを求める方法が知りたかったものですから。
- noocyte
- ベストアンサー率58% (171/291)
そのソースの中にも書かれている sizeof(((XXXX*)0)->chwk) をマクロ化して, #define MemberSizeOf(type, member) sizeof(((type*)0)->member) MemberSizeOf(XXXX, chwk) ではご不満ですか?
お礼
回答ありがとうございます。 実体にNULLを使うところが自分で納得いかなくて でもDEFINEとか使う以外に単純に メンバーのサイズを求める方法が知りたかったものですから。
補足
やはりこの方法になりそうですね。 ありがとうございました。
お礼
ご回答ありがとうございます。 >offsetof マクロの実装でも NULL ポインタはよく利用されていますしね。 そうでしたか。 私は不勉強で初めて知りました。 >C++でなら通ってもよさそうな sizeof(XXXX::chwk) でもダメみたいですね。 そうみたいですね。 ありがとうございました。