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's来完成。

做这样的事情:

#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;
}

现在您可以在 main 中执行以下操作:

#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 仅允许您使用sizeof运算符确定结构所需的字节数(包括填充字节)。只要结构成员都具有相同的类型,就可以sizeof(struct foo)/sizeof(membertype)用来计算成员的数量。在一般情况下,对于不同大小的成员类型,这在 C 语言中是不可能的(您可以自动对源进行后处理并填写结果,但这很难看)。C 根本不允许在其他语言(例如 perl)中所谓的自省。

但是,您(和编译器)知道编译时的成员数。为什么要在运行时计算已知数?也许您可以说明您要解决的实际问题,我们可以指出一个不涉及成员数量的解决方案......

于 2012-08-30T11:34:24.113 回答
2

没有办法做到这一点,这是内置在 C 语言 AFAIK 中的。如果你想这样做,你需要记住成员的数量或将数字硬编码为函数的返回值。C 可以告诉您结构的大小(以字节为单位),但不能告诉您它们包含的成员数。或者,您可以使用结构的成员函数来返回硬编码的成员数。

于 2012-08-30T10:34:03.450 回答
1

这不能在 C 中完成。

如果你真的需要这个,你应该尝试一种支持反射的更高级的语言。(Java、Python)。

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

于 2012-08-30T14:42:14.863 回答