gpt4 book ai didi

c - C 中可变大小结构的不完整类型

转载 作者:太空宇宙 更新时间:2023-11-03 23:24:12 25 4
gpt4 key购买 nike

到目前为止,我一直在使用 void * 作为在 C 中封装私有(private)数据的方法。想法是:用户不应该为内部而烦恼,而只请求公开的函数。

例如:

typedef void* myPrivateType;

myPrivateType createMPt(int someArg);
int doSomething(myPrivateType mpt, int someOtherArg);
void freeMpt(myPrivateType mpt);

这在隐藏 myPrivateType 的内部方面效果很好。然而,还有最后一个小问题:void* 非常宽容,编译器会静静地接受任何类型的指针,并且在类型不正确的情况下不会触发任何警告。这看起来像是一个小问题,但它只会增加用户不正确使用界面并浪费大量时间尝试调试错误的可能性。

因此,我现在倾向于使用 incomplete types而不是 void*,作为在编译期间控制类型的更严格的方法。

因此前面的例子变成了如下:

typedef struct foo* myPrivateType;

myPrivateType createMPt(int someArg);
int doSomething(myPrivateType mpt, int someOtherArg);
void freeMpt(myPrivateType mpt);

如您所见,几乎没有任何变化,只有 typedef。它现在比前面的例子工作得更好,如果用户提供另一个指针而不是 `myPrivateType',编译器会报错,错误会立即被捕获。

这是一个相当不错的选择。除此之外,在代码的“私有(private)部分”(.c 文件)中,我必须定义什么是 struct foo。在某些情况下,当这些内容被明确和静态地定义时,它非常简单。

但有时,myPrivateType 的内容取决于运行时提供的一些变量,因此其大小可能会有所不同。这对 C struct 不利,它应该在编译时具有定义的大小。

作为变通方法,我可以通过这种方式对 myPrivateType 进行类型定义:

typedef size_t* myPrivateType;

typedef size_t myPrivateType[];   // equivalent

这让以后可以决定大小,作为 size_t 的倍数。但是现在,myPrivateType 更加宽松,因为任何 size_t* 指针也符合要求。

我想知道是否有一种方法可以结合这两个属性,myPrivateType 非常严格,因此不可能与任何其他类型的指针混淆,但底层的私有(private)数据保持能够在运行时选择它的大小。

最佳答案

怎么样:

struct myPrivateType { void * private; };

使用方式与使用原始 void 指针的方式基本完全相同。您可以在 header 中公开整个结构,因为无论如何应用程序都无法使用它包含的 void 指针做任何事情。

这解决了使用 void * 进行隐式转换的问题,除了库函数中的 mpt->private 取消引用之外没有引入任何刺激。

编辑:如果您愿意,可以使用 typedef struct myPrivateType myPrivateType; 构造。

关于c - C 中可变大小结构的不完整类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30970054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com