一只甜甜圈
不透明指针是不透露基础数据细节的指针(根据字典定义:opaque:形容词;无法透视;不透明)。例如,您可以在头文件中声明(这来自我的一些实际代码):typedef struct pmpi_s *pmpi;它声明的类型pmpi是指向不透明结构 的指针struct pmpi_s,因此您声明的任何内容都pmpi将是不透明的指针。该声明的用户可以自由编写如下代码:pmpi xyzzy = NULL;不知道结构的实际“定义”。然后,在了解定义的代码(即提供pmpi处理功能的代码)中,可以“定义”结构:struct pmpi_s { uint16_t *data; // a pointer to the actual data array of uint16_t. size_t sz; // the allocated size of data. size_t used; // number of segments of data in use. int sign; // the sign of the number (-1, 0, 1).};并轻松访问它的各个字段,而标头文件的用户无法执行此操作。有关不透明指针的更多信息,请参见Wikipedia页面。它的主要用途是对库用户隐藏实现细节。封装(尽管C ++人群会告诉您什么)已经存在很长时间了:-)您只想在库中发布足够的详细信息,以便用户有效地使用它,而不再需要更多。发布更多内容会为用户提供他们可能依赖的详细信息(例如size变量sz位于结构中的特定位置,这可能会导致他们绕过控件并直接对其进行操作。然后,当您更改内部结构时,您会发现客户苦苦抱怨。没有该结构信息,您的API仅限于您提供的内容,并且可以维护有关内部操作的自由。