3

我是hiredis的新手并使用v0.13。我注意到hiredis.h处理redisReply*对象的 API 函数都使用void*. 例如,

void *redisCommand(redisContext *c, const char *format, ...);

返回一个redisReply*对象(或NULL);

int redisGetReply(redisContext *c, void **reply);

通过;输出一个redisReply*对象reply

void freeReplyObject(void *reply);

是,根据代码注释,“释放回复对象的函数hiredis默认返回。”</p>

我在这里遗漏了什么——为什么这些函数使用void*而不是redisReply*

4

2 回答 2

3

我注意到hiredis.h处理redisReply*对象的 API 函数都使用void*

我可以看到解释您的描述的唯一合理方法是您已经分析了实现以在内部发现它使用指向名为的类型的指针redisReply,但接口通过 type 处理此类指针void *

这将是一种强制该 API 的客户端将回复对象指针作为不透明值处理的机制。客户端(可能)没有 的定义redisReply,甚至没有它的名称,并且在回复指针和该类型之间没有声明的关联,因此 API 明确避免为客户端提供创建此类对象或解释或修改的方法它们的值不是通过 API 自己的函数。他们所能做的就是从 API 接收那些不透明的指针并将它们传回。

然而,我还要说,这种处理不透明指针的特殊方法是一种糟糕的方法。可以在不放弃不透明度的情况下提供更好的类型安全性,如上面链接问题的答案所示。

于 2019-06-21T14:03:36.367 回答
1

泛型函数通常以这种方式编写,因为您可以将任何指向 void * 和 void * 的指针强制转换为相同的指针(关于 char 指针类型也是如此)而没有风险和可移植性。您也不会收到任何编译器警告。

于 2019-06-21T13:32:54.653 回答