gpt4 book ai didi

c - 有没有更好的方法来比较两个 C 结构?

转载 作者:行者123 更新时间:2023-12-05 09:02:52 25 4
gpt4 key购买 nike

假设我声明了一个用于保存配置信息的 C 结构,它有很多字段(~30),例如:

struct config {
int a;
int b;
int c;
...
char *str1;
char *str2;
...
};

如果不简单地枚举和比较每个元素,比较两个结构的最佳方法是什么?当然,我可以使用以下代码,但我的问题是,是否有更简单的方法来实现这一点?

static int
cmpInstances(struct config *l, struct config *r) {
return (
l->a == r->a &&
l->b == r->b &&
l->c == r->c &&
!strcmp(l->str1, r->str1) &&
!strcmp(l->str2, r->str2)
);
}

是否有一些宏可以做到这一点?例如:cmpInstancesViaMacro(a,b,c) 将扩展为

   l->a == r->a &&
l->b == r->b &&
l->c == r->c

最佳答案

所谓的 X Macros 的广义变体可以使用。

在问题的例子中,它看起来像这样:

#define CONFIG_FIELDS \
X_INT(a) \
X_INT(b) \
X_INT(c) \
X_STRING(str1) \
X_STRING(str2)

struct config {
#define X_INT(NAME) int NAME;
#define X_STRING(NAME) char *NAME;
CONFIG_FIELDS
#undef X_INT
#undef X_STRING
};

static int cmpInstances(struct config *l, struct config *r) {
#define X_INT(NAME) l->NAME == r->NAME &&
#define X_STRING(NAME) strcmp(l->NAME, r->NAME) == 0 &&
return CONFIG_FIELDS 1;
#undef X_INT
#undef X_STRING
}

使用此解决方案,只要使用的类型集没有变化,当结构发生变化时,只需更改 CONFIG_FIELDS 宏。结构和功能将自动保持同步。

如果引入了新的类型,对应的X Macros必须定义类似上面的X_INTX_STRING

关于c - 有没有更好的方法来比较两个 C 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70714601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com