如何获得结构中的成员数量?

我想计算结构中的成员数量。 例如:

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

我创建了一个函数原型,它应该返回结构中的成员数

 int NumberOfMem(Bg_Typedef *psStructure); 

=> NumberOfMem(&FooStr)应返回3

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

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

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

它可以用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  ... 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 

这不能在C中完成。

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

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