初识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更能明确地表示这是一个希望对用户隐藏内部结构的数据类型。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值