我可以知道C中不透明指针概念背后的用法和逻辑吗?

推荐答案

不透明指针是指不显示底层数据细节的指针(根据字典定义: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仅限于您提供的内容,并且您可以自由地对内部进行操作.

C++相关问答推荐

librsvg rsvg_handle_get_dimensions获取像素大小与浏览器中的渲染大小没有不同

CC crate 示例不会与C函数链接

为什么这个C程序代码会产生以下结果?

如何判断宏参数是否为C语言中的整型文字

为什么输出不是从上到下C

为什么我一直收到分段错误?

可以将C变量限制为特定的读/写速度吗?

ifdef __cplusplus中的整数文字单引号

将字符串数组传递给C中的函数:`str[dim1][str_size]`vs`*str[dim1]`

链接器脚本和C程序使用相同的头文件,这可能吗?

我不知道为什么它不能正常工作,我用了get()和fget(),结果是一样的

从另一个宏函数调用C宏

向左移位3如何得到以字节为单位的位数?

Malloc和对齐

将size_t分配给off_t会产生符号转换错误

C 错误:对 int 数组使用 typedef 时出现不兼容的指针类型问题

如何用用户输入的多个字符串填充数组?

GDB 用内容初始化数组

clion.我无法理解 Clion 中发生的 scanf 错误

C语言程序流程解释