我有这种方法(简化):
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)
我可以避免演员表问题吗?仍然使用像我的愿望?例如,如上所示,有一些整数和字符串
答案 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*
的指针。那时,必须处理混合有符号和无符号整数的问题。