gpt4 book ai didi

c - 隐式转换为 union 类型?

转载 作者:行者123 更新时间:2023-12-02 01:24:37 24 4
gpt4 key购买 nike

假设我们有以下描述一个人的参数:name(字符串)和age(无符号整数)。我想编写一个通用的 setter API 函数,有人可以调用它来设置特定人的姓名或年龄。其原因将在下面解释。

我所做的是定义一个枚举类型的人员参数名称:

typedef enum person_param_name
{
NAME,
AGE,
} person_param_name_t;

还有人员参数值的 union 类型:

typedef union person_param_val
{
char* name;
unsigned int age;
} person_param_val_t;

现在,该函数可以如下所示:

int set_person_param(person_param_name_t param_name, person_param_val_t param_val)
{
int ret = 0;

switch (param_name)
{
case NAME:
g_person_name = param_val.name;
break;
case AGE:
g_person_age = param_val.age;
break;
default:
ret = -1;
break;
}

return ret;
}

这种方法的问题在于,不能像这样简单地调用 setter 函数(编译器会抛出警告):

set_person_param(NAME, "Alex");
set_person_param(AGE, 5);

但他们必须显式地将参数值转换为 person_param_val_t 类型,如下所示:

set_person_param(NAME, (person_param_val_t)"Alex");
set_person_param(AGE, (person_param_val_t )5);

我想要通用 setter 函数的原因是因为在实际程序中,我有很多参数(接近 100 个),并且我需要编写许多(非常相似)setter 函数,这将需要更多行代码。

有更好的方法吗?

最佳答案

如果更改 union 以使字段名称与枚举常量相同:

typedef union person_param_val
{
char* NAME;
unsigned int AGE;
} person_param_val_t;

然后您可以创建一个宏,它将传递正确初始化的复合文字:

#define set_person_param_ext(k,v) \
set_person_param(k, (person_param_val_t){.k=v})

那么这个:

set_person_param_ext(NAME, "Alex");
set_person_param_ext(AGE, 5);

将扩展为:

set_person_param(NAME, (person_param_val_t){.NAME="Alex"});
set_person_param(AGE, (person_param_val_t){.AGE=5});

关于c - 隐式转换为 union 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75076585/

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