0

構造体のメンバー数を数えたい。例えば:

typedef struct
{
    char    MrChar;
    int MrInt;
    long    MrLong;
} Bg_Typedef;
Bg_Typedef FooStr;

構造体のメンバー数を返す関数プロトタイプを作成します

int NumberOfMem(Bg_Typedef *psStructure); 

=> NumberOfMem(&FooStr) は 3 を返す必要があります

4

4 に答える 4

6

でできます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);

上記と同じように動作しますが、著しく読みやすくなっています。参考文献を参照してください。

于 2016-07-18T02:57:17.377 に答える
2

C言語AFAIKに組み込まれているこれを行う方法はありません。これを行うには、メンバーの数を覚えておくか、関数の戻り値として数値をハードコーディングする必要があります。C は、構造体のバイト単位のサイズを通知できますが、構造体に含まれるメンバーの数は通知できません。または、構造体のメンバー関数を使用して、ハードコードされたメンバー数を返すこともできます。

于 2012-08-30T10:34:03.450 に答える
2

sizeofC では、構造体に必要なバイト数 (パディング バイトを含む) を演算子を使用して決定することしかできません。構造体のメンバーがすべて同じ型である限り、 を使用sizeof(struct foo)/sizeof(membertype)してメンバーの数を計算できます。一般に、メンバー型のサイズが異なる場合、これは C 言語内からは不可能です (ソースを自動的に後処理して結果を埋めることはできますが、それは見苦しいです)。C では、他の言語 (perl など) でいわゆるイントロスペクションが許可されていません。

しかし、その後、あなた (およびコンパイラー) はコンパイル時にメンバーの数を知っています。実行時に既知の数値を計算する必要があるのはなぜですか? 解決しようとしている実際の問題を述べていただければ、メンバー数を含まない解決策を指摘できるかもしれません...

于 2012-08-30T11:34:24.113 に答える
1

これは C では実行できません。

これが本当に必要な場合は、リフレクションをサポートするより高水準の言語を試してください。(ジャバ、パイソン)。

http://en.wikipedia.org/wiki/Reflection_%28computer_programming%29

于 2012-08-30T14:42:14.863 に答える