函数的通用接口(interface)

标签 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 指针等传递并不总是可以的。

那么这样的原型(prototype)有addraw函数是不是更好呢?

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

我会避免转换问题吗?仍然使用 Like I desire?例如,如上所示,使用整数和字符串

最佳答案

would [the prototype with void*] avoid the cast problem?

是的,带有 void* 的原型(prototype)可以让您避免在调用点强制转换指针。

[can I] use Like I desire?

这取决于您想要做什么:如果您打算将 data 指针指向的数据解释为指向未签名数据的数据,并改为传递已签名数据,您将获得实现 -具体行为。如果您需要做的只是将“原始”数据从一个缓冲区复制到另一个缓冲区,void* 是一个完美的选择。

关于函数的通用接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25828602/

相关文章:

找不到 SendInput() 函数使用的任何数据类型

C - 在 R Holt-Winters 函数中调用的 C_Holt-Winters 函数

c - 从 char * 指向的内存的一个字节中检索 long int 和 float 的值

c - 如何在循环中求和?并将其传递给另一个案例?

c - 释放/解除分配缓冲区时出现段错误

c - 小整数 vector 的高效比较

c - 结构体数组的结构体

c - 如何检查字符串中是否有 10 位数字

c - 双栈套接字上的 getnameinfo() 函数返回不正确的 IP 地址?

c - 线程的 mmap 中 MAP_PRIVATE 和 MAP_SHARED 之间的区别