首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获取结构中的成员数量?

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

Stack Overflow用户
提问于 2012-08-30 18:27:22
回答 4查看 8.5K关注 0票数 0

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

代码语言:javascript
复制
typedef struct
{
    char    MrChar;
    int MrInt;
    long    MrLong;
} Bg_Typedef;
Bg_Typedef FooStr;

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

代码语言:javascript
复制
int NumberOfMem(Bg_Typedef *psStructure); 

=> NumberOfMem(&FooStr)应返回3

EN

回答 4

Stack Overflow用户

发布于 2016-07-18 10:57:17

这可以用X_MACRO的来完成。

这样做:

代码语言:javascript
复制
#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,这样它就不会被覆盖

代码语言:javascript
复制
static int
bg_members_count() {
    #define X(_, __) +1
    static int COUNT = 0
    X_BG_MEMBERS;
    #undef X
    
    return COUNT;
}

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

代码语言:javascript
复制
#include <stdio.h>
...

int main() {
    printf("The number of members defined in Bg_Typedef is %d\n", bg_members_count());
}

你应该会得到类似这样的东西:

代码语言:javascript
复制
The number of members defined in Bg_Typedef is 3

您可能只需要一个常量,因此可以执行以下操作

代码语言:javascript
复制
#define X(_, __) +1
static const int COUNT = X_BG_MEMBERS;
#undef X

另一种模式

为了避免在#undef X之后有大量的#define X...,这样做可能是有益的:

代码语言:javascript
复制
#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);

它的工作原理与上面的相同,但可读性明显更好。参见ref

票数 6
EN

Stack Overflow用户

发布于 2012-08-30 18:34:03

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

票数 2
EN

Stack Overflow用户

发布于 2012-08-30 19:34:24

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12194793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档