我想计算结构中的成员数量。 例如:
typedef struct
{
char MrChar;
int MrInt;
long MrLong;
} Bg_Typedef;
Bg_Typedef FooStr;
我创建了一个函数原型,它应该返回结构中的成员数
int NumberOfMem(Bg_Typedef *psStructure);
=> NumberOfMem(& FooStr)应返回3
答案 0 :(得分:2)
没有办法在C语言AFAIK中内置。如果你想这样做,你需要记住成员的数量或硬编码作为函数的返回值。 C可以告诉您结构的大小(以字节为单位),但不能告诉它们包含的成员数。或者,您可以使用结构的成员函数来返回硬编码的成员数。
答案 1 :(得分:2)
C仅允许您使用sizeof
运算符确定结构所需的字节数(包括填充字节)。只要结构成员具有相同的类型,您就可以使用sizeof(struct foo)/sizeof(membertype)
来计算成员数。在一般情况下,对于不同大小的成员类型,这在C语言中是不可能的(您可以自动处理源并填写结果,但这很难看)。 C根本不允许在其他语言中使用所谓的 Introspection (例如perl)。
但是,您(和编译器)知道编译时的成员数。 为什么要在运行时计算已知数字?也许您可以说明您要解决的实际问题,我们可以指出一个不涉及成员计数的解决方案......
答案 2 :(得分:2)
可以使用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;
}
现在你可以在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
答案 3 :(得分:1)
这不能在C中完成。
如果你真的需要这个,你应该尝试一种支持反射的更高级语言。 (Java,Python)。
http://en.wikipedia.org/wiki/Reflection_%28computer_programming%29