我是新入门的hiredis和使用v0.13。我注意到来自hiredis.h的处理redisReply*对象的API函数都使用void*。例如,
void *redisCommand(redisContext *c, const char *format, ...);返回redisReply*对象(或NULL);
int redisGetReply(redisContext *c, void **reply);通过reply输出redisReply*对象;
void freeReplyObject(void *reply);根据代码注释,默认情况下是一个“释放回复对象hiredis返回的函数”。
这里我遗漏了什么-为什么这些函数使用void*而不是redisReply*
发布于 2019-06-21 22:03:36
我注意到来自
hiredis.h的处理redisReply*对象的函数都使用void*
我所能看到的解释您的描述的唯一明智的方法是,您已经分析了实现,发现在内部,它使用指向名为redisReply的类型的指针,但是接口通过类型void *来处理此类指针。
这将是一种强制API客户端将应答对象指针作为opaque values处理的机制。客户机(大概)没有redisReply的定义,甚至没有它的名字,应答指针和那个类型之间也没有声明的关联,所以API显式地避免为客户机提供一种方法来创建这样的对象,或者解释或修改它们的值,而不是通过API自己的函数。它们所能做的就是从API接收这些不透明的指针,并将它们传递回来。
然而,我也要说,这种针对不透明指针的特殊方法是一种糟糕的方法。可以在不放弃不透明性的情况下提供更好的类型安全性,如上面链接的问题的答案所示。
发布于 2019-06-21 21:32:55
泛型函数通常是这样编写的,因为您可以将任何指针转换为void *和void *到相同的指针(与char指针类型相同),而不会有风险和可移植性。您也不会收到任何编译器警告。
https://stackoverflow.com/questions/56704385
复制相似问题