構造体のメンバーをヘッダーファイル中で得たい場合、
以下のような方法以外になにか方法はないでしょうか?
単純に
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));
}
No.4ベストアンサー
- 回答日時:
う~ん・・・
質問者さんの方法をマクロ関数にした#1さんの方法がベストじゃないかなぁと思います。
offsetof マクロの実装でも NULL ポインタはよく利用されていますしね。
ちなみに、C++でなら通ってもよさそうな sizeof(XXXX::chwk) でもダメみたいですね。
まぁ、クラス変数ではないのだから、当然かも知れませんが。
ご回答ありがとうございます。
>offsetof マクロの実装でも NULL ポインタはよく利用されていますしね。
そうでしたか。
私は不勉強で初めて知りました。
>C++でなら通ってもよさそうな sizeof(XXXX::chwk) でもダメみたいですね。
そうみたいですね。
ありがとうございました。
No.3
- 回答日時:
意味もなく「100」という数値がこんなところに出てくるのがそもそもおかしいです.
普通は記号定数として #define されているはずなので, それを使うのが普通でしょう.
結果的には #4 と同じですが.
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;
でいいのではないでしょうか?
回答ありがとうございます。
ご指摘ごもっともです。
説明が重複しますが、DEFINEとか使う以外に単純に
メンバーのサイズを求める方法が知りたかったものですから。
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/ …
回答ありがとうございます。
実体にNULLを使うところが自分で納得いかなくて
でもDEFINEとか使う以外に単純に
メンバーのサイズを求める方法が知りたかったものですから。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラムが書けません。 4 2023/01/22 22:57
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# 未解決の外部シンボル _printfが関数_mainで参照されました 1 2022/09/18 15:28
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CStringからchar*への型変換に...
-
C言語のintとcharの違いってな...
-
char*を初期化したいのですが
-
new charとnew char[N]の違いは?
-
strcat関数を自作したいです
-
2次元配列の文字"列"の初期化方法
-
isalpha()関数について
-
文字列の途中から途中までを抽出
-
コマンドライン引数
-
char AA[]{"全角文字"};から"全...
-
動的メモリの初期化方法について。
-
文字列内の数字削除
-
文字型配列に格納した空白の切捨て
-
文字列配列を動的に割り当てる...
-
文字列str内の全ての数字を...
-
C言語:小文字を大文字に変換す...
-
C言語を用いた環境変数の作成/...
-
小数点入りの文字列をfloat型に...
-
エクセルのMID関数は、C言語では?
-
char形配列の整数を抜き出したい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
char*を初期化したいのですが
-
C言語のintとcharの違いってな...
-
CStringからchar*への型変換に...
-
C言語にて構造体のメンバがNULL...
-
小数点入りの文字列をfloat型に...
-
C言語のプログラムについてです
-
strcat関数を自作したいです
-
fstream型オブジェクトを関数の...
-
new charとnew char[N]の違いは?
-
DWORDとcharの変換
-
文字列の途中から途中までを抽出
-
char 文字列型 の表現範囲が-12...
-
const char* s1とただのchar s1...
-
wsprintf( ポインタ , "%d" , "...
-
c言語でポインタ変数を用いた配...
-
char型にint型の数値を代入する。
-
C言語で文字列をかえす正しい書...
-
C++17で、unsigned char * 配列...
-
共用体について
-
エクセルのMID関数は、C言語では?
おすすめ情報