gpt4 book ai didi

c - 在 C 函数中传递泛型参数

转载 作者:太空宇宙 更新时间:2023-11-04 06:47:28 25 4
gpt4 key购买 nike

我有一个结构

typedef struct
{
void *l_var;
void *r_var;
}EXPR;

EXPR expr;

我初始化它

expr.l_var = &motor_rt_params[0].position;
expr.r_var = &motor_rt_params[1].position;

现在我想用值来操作

void SCRIPT_Process(void *l_var, void *r_var, uint32_t oper)
{
int32_t res;

switch (oper)
{
case OP_PLUS:
res = *((??? *) l_var) + *((??? *)r_var);
break;
case OP_MINUS:
res = *((??? *) l_var) - *((??? *)r_var);
break;
}
}

SCRIPT_Process(expr.l_var , expr.r_var , OP_PLUS);

变量可以是32位、16位、8位。问题 - 如何在运行时将其转换为适当的类型(而不是 (??? *))?

最佳答案

如何在初始化指针时也保存大小?

typedef struct
{
void *l_var;
void *r_var;
size_t sz;
}EXPR;

expr.l_var = &motor_rt_params[0].position;
expr.r_var = &motor_rt_params[1].position;
expr.sz = sizeof(motor_rt_params[1].position);

例如允许

void SCRIPT_Process(void *l_var, void *r_var, size_t sz, uint32_t oper)
{
int32_t res;

switch (oper)
{
case OP_PLUS:
if (sz == sizeof(int32_t))
res = *((int32_t *) l_var) + *((int32_t *)r_var);
else /* suppose a int16_t */
res = *((int16_t *) l_var) + *((int16_t *)r_var);
break;
case OP_MINUS:
if (sz == sizeof(int))
res = *((int32_t *) l_var) - *((int32_t *)r_var);
else /* suppose a int16_t */
res = *((int16_t *) l_var) - *((int16_t *)r_var);
}
}

SCRIPT_Process(expr.l_var , expr.r_var , expr.sz, OP_PLUS);

假设它只是 intshort,我让你添加 int8_t

的大小写

将大小放在 EXPR 中的好处是不会丢失该信息/由于在不同的代码段中进行管理而因错误而造成不一致。

或者可能是在 SCRIPT_Process 的参数中分别给出 EXPR 而不是字段?

可能您还需要知道是否有符号或无符号,使用附加字段,或使用 int 来评估无符号(4、2 或 1)的正数和负数的大小对于带符号的 (-4, -2 -1)。

另一种方法是保存指向正确函数的指针而不是大小,这是一种 C++ 虚拟实现。

当然,所有这些都假设您不能将值保存为结构中的 int32_t,而您确实需要保存指针。

关于c - 在 C 函数中传递泛型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56098462/

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