加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

定义一个宏,它接受一个结构实例并为每个’void *’成员调用’fre

发布时间:2020-12-16 10:10:18 所属栏目:百科 来源:网络整理
导读:我有几种类似的结构类型. 每种类型都有几种不同类型的成员. 例如: struct A{ char a1; short a2; void* a3; int a4; void* a5;};struct B{ void* b1; long b2; void* b3; void* b4;}; 我想定义一个宏,它接受一个结构实例并为每个void *成员调用free. 我认为
我有几种类似的结构类型.

每种类型都有几种不同类型的成员.

例如:

struct A
{
    char  a1;
    short a2;
    void* a3;
    int   a4;
    void* a5;
};

struct B
{
    void* b1;
    long  b2;
    void* b3;
    void* b4;
};

我想定义一个宏,它接受一个结构实例并为每个void *成员调用free.

我认为__VA_ARGS__在这里可能有用,但我不太清楚如何.

任何替代想法(包括运行时解决方案)也将受到赞赏.

解决方法

也许与X Macros?

#define structAFields 
    X(char,a1,) 
    X(short,a2,) 
    X(void*,a3,) 
    X(int,a4,a5,) 

#define X(A,B,C) A B C;
struct A
{
    structAFields
};
#undef X

#define X(A,C) if(strcmp(#A,"void*") == 0) *((void **)((void *)(&a->B))) = malloc(2);
void mallocA(struct A * a)
{
    structAFields
}
#undef X

#define X(A,"void*") == 0) free(*((void **)((void *)(&a->B))));
void freeA(struct A * a)
{
    structAFields
}
#undef X

int main(int argc,char **argv) {
    struct A a;

    mallocA(&a);
    freeA(&a);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读