初识C语言中的opaque类型

在移植yaffs2到VxWorks的过程中发现direct/yaffsfs.h中有这么一行代码:

typedef struct __opaque yaffs_DIR;

而该头文件中并没有任何关于struct __opaque的定义,搜寻了一下系统里的其他头文件,也没有找到。google了一下才找到一篇介绍这种用法的文章Programming Tools - Opaque Pointers

opaque直译的意思是不透明的,C语言中允许通过typedef申明一个抽象的结构体类型,如上例所示,你无需定义struct __opaque的具体实现,就能在其他函数的声明中使用该数据类型的__指针__。注意,只能是指针,如果是void foo(yaffs_DIR dir),系统就会提示error: dir has incomplete type

在库文件中,opaque类型的实现如下面的代码所示:

typedef struct
{
    __u32 magic;
    yaffs_dirent de;        /* directory entry being used by this dsc */
    char name[NAME_MAX+1];      /* name of directory being searched */
    yaffs_Object *dirObj;       /* ptr to directory being searched */
    yaffs_Object *nextReturn;   /* obj to be returned by next readddir */
    int offset;
    struct list_head others;    
} yaffsfs_DirectorySearchContext;

yaffs_DIR *dir = NULL;
yaffsfs_DirectorySearchContext *dsc = NULL;
...
dsc = YMALLOC(sizeof(yaffsfs_DirectorySearchContext));
dir = (yaffs_DIR *)dsc;

代码中为抽象类型yaffs_DIR的指针分配了一个具体类型yaffsfs_DirectorySearchContext的空间。而这一层对使用者是不可见的,也许这是opaque这个名字的由来,这种做法可以提高库文件升级过程中对外接口的稳定性。

最后提一点,opaque并不是一个关键词,你可以任意使用其他名字,只是用opaque更能明确地表示这是一个希望对用户隐藏内部结构的数据类型。

xgbing CSDN认证博客专家 驱动开发 arm开发 嵌入式硬件
专注于嵌入式方向的软硬件设计与开发(ASM\C\C++,RTOS,Linux,android,以太网\嵌入式网络协议栈,蓝牙,WIFI,文件系统/嵌入式存储,显示\音频,单片机\DSP\ARM\Cortex,电路设计\PCB布板\硬件驱动\数字逻辑CPLD,FPGA\niosII),目前从事VirtualBox\qemu\KVM虚拟化研究工作。
©️2020 CSDN 皮肤主题: 程序猿惹谁了 设计师:上身试试 返回首页