簡體   English   中英

為什么hiredis函數使用void *而不是redisReply *?

[英]Why do hiredis functions use void* instead of redisReply*?

我是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*

我注意到hiredis.h的API函數處理redisReply*對象,都使用void*

我看到的解釋您描述的唯一明智的方法是,您已經分析了實現以在內部找到它,它使用指向名為redisReply的類型的指針,但是接口通過void *類型處理此類指針。

那將是一種強制該API的客戶端將回復對象指針作為不透明值處理的機制。 客戶端(大概)沒有redisReply的定義,甚至沒有名稱,並且回復指針和該類型之間沒有聲明的關聯,因此API明確避免為客戶端提供一種創建此類對象或解釋或解釋對象的方法。除了通過API自身的功能之外,還可以修改其值。 他們所能做的就是從API接收那些不透明的指針,並將它們傳遞回去。

但是,我還要說的是,這種不透明指針的特殊方法是一種糟糕的方法。 如上面對問題的回答所示,可以提供更好的字體安全性而又不放棄不透明度。

泛型函數通常以這種方式編寫,因為您可以將任何指向void *和void *的指針強制轉換為相同的指針(與char指針類型相同)而沒有風險和可移植性。 您也不會收到任何編譯器警告。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM