功能的通用接口

时间:2014-09-13 23:07:42

标签: c

我有这种方法(简化):

void addraw(struct chain*a, uint8_t *data).

关键是我可以通过以下函数调用它:

void adduint16(struct chain*a, uint16_t val)
{
  uint8_t x[2] = {0};
  memcpy(x, &val, 2);

  addraw(chain, x);
}

现在说如果我有方法:

void addstr(struct chain*a, char* val)

我很容易做到:

void addstr(struct chain*a, char* val)
{
   addraw(chain, (uint8_t*) val);
}

但我认为将char *作为uint8_t指针等传递并不总是正常的。

这样的原型更好吗?

void addraw(struct chain*a, void *data)

我可以避免演员表问题吗?仍然使用像我的愿望?例如,如上所示,有一些整数和字符串

2 个答案:

答案 0 :(得分:1)

  

[带有void*的原型]会避免演员问题吗?

是的,使用void*的原型可以让你避免在通话点投射指针。

  

[我可以]像我想要的那样使用吗?

这取决于您想要做什么:如果您计划将data指针指向的数据解释为指向无符号数据的数据,而是传递签名数据,您将获得特定于实现的行为。如果你需要做的就是将“原始”数据从一个缓冲区复制到另一个缓冲区,void*是一个完美的选择。

答案 1 :(得分:0)

你说,

  

但我认为将char *作为uint8_t指针等传递并不总是正常的。

简答:你是对的。

更长的答案:如果平台上的char是无符号整数值,则取决于您的平台,您应该没问题。如果没有,您可能会遇到与混合有符号和无符号整数值相关的问题。

通过将addraw的签名更改为:

,问题不会消失
void addraw(struct chain*a, void *data)

当您编译使用adddraw的文件时,它似乎会消失。但是,在adddraw内,您已将data转换为指向uint8_t*char*的指针。那时,必须处理混合有符号和无符号整数的问题。