什么定义了C中的opaque类型,它们何时是必需的和/或有用的?

Sie*_*geX 37 c types

我已经看到了"不透明类型"的概念,但我真的没有找到一个简洁的答案,关于什么定义了C中的opaque类型,更重要的是它们允许我们用它们的存在解决的问题.谢谢

Pho*_*ong 34

它最常用于图书馆目的.C语言中Opaque类型背后的主要原则是通过其指针使用数据以隐藏数据处理实现.由于隐藏了实现,您可以修改库而无需重新编译任何依赖它的程序(如果遵循该接口)

例如:版本1:

// header file
struct s;

int s_init(struct s **x);
int s_f(struct s *x);
int s_g(struct s *x);

// source file
struct s { int x; }

int s_init(struct s **x) { *x = malloc(...); }
int s_f(..) { ... }
int s_g(..) { ... }
Run Code Online (Sandbox Code Playgroud)

版本2

// header file
struct s;

int s_init(struct s **x);
int s_f(struct s *x);
int s_g(struct s *x);

// source file
struct s { int y; int x; }

int s_init(struct s **x) { *x = malloc(...); }
int s_f(..) { ... }
int s_g(..) { ... }
Run Code Online (Sandbox Code Playgroud)

从你的程序方面来看,没有任何改变 并且如前所述,无需重新编译依赖它的每个程序.

  • 使用extern作为变量通常用于声明全局变量(这与我们的情况绝对无关).这里是指令结构; 在这里向compilator指出一个名为struct s的类型.由于头文件中的所有API都只使用指向此结构的指针.它不需要知道结构大小,而是结构指针的大小(由编译器定义).为简化起见,它允许程序使用其地址(指向结构的指针)来使用对象 (2认同)

Tim*_*tes 14

在我的理解中,opaque类型是那些允许你持有句柄(即指针)到结构,但不能直接修改或查看其内容的类型(如果你完全允许,你可以通过理解的帮助函数来实现)内部结构).

不透明类型在某种程度上是使C更加面向对象的一种方式.它们允许封装,因此类型的内部细节可以改变 - 或者在不同平台/情况下以不同方式实现 - 而不使用它的代码必须改变.

  • 请记住,c和它产生的文化可以追溯到面向对象是一种罕见且仍然相当实验性的时期.程序和功能程序员将时间集中在封装中,作为控制互连性和不必要复杂性的手段.谈论c中的不透明类型作为一种残缺的对象是将外国POV推向语言. - dmckee 10分钟前 (5认同)
  • 狡辩:这个成语只是*关于封装.封装对于面向对象是必要的,但它是它的最小部分. (2认同)
  • 诚然,对于几乎面向对象的任何事物来说,它需要的远不止这些。尽管如此,这是面向对象设计的一个部分,我发现我在用 C 编写时*总是*缺少。另外,如果你*是*尝试在 C 中模拟继承和多态性(更多的工作是值得的) ),您几乎肯定需要从不透明类型开始。 (2认同)
  • @dmckee它不仅适用于封装.您也可以使用opaque类型来实现继承/多态,即使这可能不是不完整类型的初衷.无论如何,最重要的是面向对象是一个程序_design方法_,它不是一种语言特征.无论语言如何,您都应该始终使用面向对象的程序设计!设计完成后,您可以查看可用的语言功能,并检查如何以特定语言最好地实现设计. (2认同)

Jar*_*Par 8

opaque类型是一种通过指针在API中公开但从未具体定义的类型.