我是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*
?
答案 0 :(得分:3)
我注意到
hiredis.h
的API函数处理redisReply*
对象,全部使用void*
我能看到的解释您描述的唯一明智的方法是,您已经分析了实现以发现内部 ,它使用了指向redisReply
类型的指针,但是接口通过类型void *
处理此类指针。
这将是一种机制,用于强制该API的客户端将回复对象指针作为opaque values处理。客户端(大概)没有redisReply
的定义,甚至没有名称,并且回复指针和该类型之间没有声明的关联,因此API明确避免为客户端提供创建此类的方法对象或解释或修改其值,而不是通过API自己的函数。他们所能做的就是从API接收那些不透明的指针,并将其传递回去。
但是,我还要说,这种不透明指针的特殊方法是一种较差的方法。如上面对问题的回答所示,可以提供更好的类型安全性而又不放弃不透明度。
答案 1 :(得分:1)
通用函数通常以这种方式编写,因为您可以将任何指向void *和void *的指针强制转换为相同的指针(与char指针类型相同)而没有风险和可移植性。您也不会收到任何编译器警告。