不透明指针是指不显示底层数据细节的指针(根据字典定义:opaque: adjective; not able to be seen through; not transparent).
例如,您可以在头文件中声明(这来self 的一些实际代码):
typedef struct pmpi_s *pmpi;
它声明了一个类型pmpi
,它是指向不透明structure struct pmpi_s
的指针,因此任何声明为pmpi
的东西都将是不透明指针.
该声明的用户可以自由编写如下代码:
pmpi xyzzy = NULL;
不知道 struct 的实际"定义".
然后,在了解定义的代码(即提供pmpi
处理功能的代码)中,可以"定义" struct :
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 page..
它的主要用途是对库用户隐藏实现细节.封装(不管C++人群会告诉您什么)已经存在很长时间了:-)
您希望在库中发布足够的详细信息,以便用户有效地利用它,and no more. Publishing more为用户提供了他们可能依赖的详细信息(例如大小变量sz
位于 struct 中的特定位置,这可能会导致他们绕过您的控件,直接对其进行操作).
然后,当你改变内部 struct 时,你会发现你的客户怨声载道.如果没有这些 struct 信息,您的API仅限于您提供的内容,并且您可以自由地对内部进行操作.