为什么hiredis函数使用void *而不是redisReply *?

时间:2019-06-21 13:25:03

标签: c hiredis

我是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);
根据代码注释,

是“释放默认情况下返回的回复对象的函数。”

我在这里缺少什么?为什么这些函数使用void*而不是redisReply*

2 个答案:

答案 0 :(得分:3)

  

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

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

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

但是,我还要说,这种不透明指针的特殊方法是一种较差的方法。如上面对问题的回答所示,可以提供更好的类型安全性而又不放弃不透明度。

答案 1 :(得分:1)

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