首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么hiredis函数使用void*而不是redisReply*?

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

Stack Overflow用户
提问于 2019-06-21 21:25:04
回答 2查看 343关注 0票数 3

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

代码语言:javascript
复制
void *redisCommand(redisContext *c, const char *format, ...);

返回redisReply*对象(或NULL);

代码语言:javascript
复制
int redisGetReply(redisContext *c, void **reply);

通过reply输出redisReply*对象;

代码语言:javascript
复制
void freeReplyObject(void *reply);

根据代码注释,默认情况下是一个“释放回复对象hiredis返回的函数”。

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

EN

回答 2

Stack Overflow用户

发布于 2019-06-21 22:03:36

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

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

这将是一种强制API客户端将应答对象指针作为opaque values处理的机制。客户机(大概)没有redisReply的定义,甚至没有它的名字,应答指针和那个类型之间也没有声明的关联,所以API显式地避免为客户机提供一种方法来创建这样的对象,或者解释或修改它们的值,而不是通过API自己的函数。它们所能做的就是从API接收这些不透明的指针,并将它们传递回来。

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

票数 3
EN

Stack Overflow用户

发布于 2019-06-21 21:32:55

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56704385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档