構造体のメンバー数を数えたい。例えば:
typedef struct
{
char MrChar;
int MrInt;
long MrLong;
} Bg_Typedef;
Bg_Typedef FooStr;
構造体のメンバー数を返す関数プロトタイプを作成します
int NumberOfMem(Bg_Typedef *psStructure);
=> NumberOfMem(&FooStr) は 3 を返す必要があります
でできますX_MACRO
。
次のようにします。
#define X_BG_MEMBERS \
X(char, MrChar) \
X(int, MrInt) \
X(long, MrLong)
typedef struct {
#define X(type, member) type member;
X_BG_MEMBERS
#undef X
} Bg_Typedef;
Bg_Typedef FooStr;
メンバーをカウントする関数を定義します。単に変数にすることもできますが、static const
上書きされないように変数を作成します
static int
bg_members_count() {
#define X(_, __) +1
static int COUNT = 0
X_BG_MEMBERS;
#undef X
return COUNT;
}
これで、メインで次のようなことができます。
#include <stdio.h>
...
int main() {
printf("The number of members defined in Bg_Typedef is %d\n", bg_members_count());
}
次のようなものを取得する必要があります。
The number of members defined in Bg_Typedef is 3
定数が必要な場合もあるので、次のことができます
#define X(_, __) +1
static const int COUNT = X_BG_MEMBERS;
#undef X
#define X...
がたくさん続くのを避けるために#undef X
、代わりに次のようなことをするのが有益かもしれません:
#define X_BG_MEMBERS(X) \
X(char, MrChar) \
X(int, MrInt) \
X(long, MrLong)
#define BG_STRUCT_FIELD(type, field) type field;
#define BG_COUNT_MEMBER(_, __) +1
typedef struct {
X_BG_MEMBERS(BG_STRUCT_FIELD)
} Bg_Typedefarguably;
static int
bg_members_count() {
static int COUNT = X_BG_MEMBERS(BG_COUNT_MEMBER);
return COUNT;
}
// OR constant
// static const int COUNT = X_BG_MEMBERS(BG_COUNT_MEMBER);
上記と同じように動作しますが、著しく読みやすくなっています。参考文献を参照してください。
C言語AFAIKに組み込まれているこれを行う方法はありません。これを行うには、メンバーの数を覚えておくか、関数の戻り値として数値をハードコーディングする必要があります。C は、構造体のバイト単位のサイズを通知できますが、構造体に含まれるメンバーの数は通知できません。または、構造体のメンバー関数を使用して、ハードコードされたメンバー数を返すこともできます。
sizeof
C では、構造体に必要なバイト数 (パディング バイトを含む) を演算子を使用して決定することしかできません。構造体のメンバーがすべて同じ型である限り、 を使用sizeof(struct foo)/sizeof(membertype)
してメンバーの数を計算できます。一般に、メンバー型のサイズが異なる場合、これは C 言語内からは不可能です (ソースを自動的に後処理して結果を埋めることはできますが、それは見苦しいです)。C では、他の言語 (perl など) でいわゆるイントロスペクションが許可されていません。
しかし、その後、あなた (およびコンパイラー) はコンパイル時にメンバーの数を知っています。実行時に既知の数値を計算する必要があるのはなぜですか? 解決しようとしている実際の問題を述べていただければ、メンバー数を含まない解決策を指摘できるかもしれません...
これは C では実行できません。
これが本当に必要な場合は、リフレクションをサポートするより高水準の言語を試してください。(ジャバ、パイソン)。
http://en.wikipedia.org/wiki/Reflection_%28computer_programming%29