在一个C程序中,我有一个struct结构体。
为了增加类型安全性,我可能会创建getter和setter。
现在第二个解决方案看起来比第一个更靠不住,它也限制了用户对非const
typedef struct {
void *payload; // opaque, real type known to callbacks
... some stuff ...
} MiddleMan;
为了增加类型安全性,我可能会创建getter和setter。
CbData *get_cb_data(const MiddleMan *mm){ return mm->payload; }
void set_cb_data(MiddleMan *mm, CbData *cbd){ mm->payload = cbd; }
或者我可以尝试使用单个基于指针的访问器来完成
CbData **cb_data(MiddleMan *mm){return (CbData**)&mm->payload;}
现在第二个解决方案看起来比第一个更靠不住,它也限制了用户对非const
mm
的访问,即使他们只想读取。但我的问题是它是否符合C语言规范?我相当确定在任何void*
与CbData*
大小和格式相同的体系结构中都可以使用它。但是有没有人可以清晰地说明为什么这在一般情况下是(或不是)有效的?
void *
和CbData *
始终具有相同的大小 - 两者都是指针类型。很抱歉,我不明白为什么你上面写的**
实现会有疑问。 - Manoj Awasthivoid *
应该足够大以涵盖所有可能性,但是CbData *
可能会更小,这取决于CbData
实际上是什么。 - Adrian Ratnapalacomp.lang.c
上听说过它们)。也许一些旧的超级计算机将数字向量放在与簿记整数不同的宇宙中。16位DOS / Windows程序之间有“近”和“远”的区别,但这与所指向的类型无关。 - Adrian Ratnapala