zoukankan      html  css  js  c++  java
  • offsetof 宏

    今天从下载了一个查找树库的源代码,奇怪的是这个库里声明的树节点没有数据域。

    于是很奇怪,没有数据域怎么用呢,难道这个库不能用?然后看了库的readme文档,找到了原因。

    原来为了应用的广泛性,这个库被故意设计成与数据域无关,用户在使用该库的时候,应当把数据域和库中的树节点封装成自己

    的数据结构,库中的函数操作事与用户数据类型无关的,仅仅需要用户提供一个比较函数而已。

    那么问题出来了,既然提供的比较函数参数中不能出现用户类型,因为库中的操作时与用户类型无关的;那么怎么才能让比较函数取到用户

    数据进行操作呢?

    没看库的代码时,对这个问题想了很久,始终不得其解,最终看了源代码,发现了该库的作者的做法。巧妙处正是这个offsetof 宏!

    作者定义了一个由结构成员指针取得结构指针的方法,做法如下:

    如果有

    struct my_struct {

       int key;

       tree_node node

    };

    比较函数的参数是node * (不能出现my_struct 类型,因为库的操作与用户数据无关); 那么 (char *) arg - offsetof (struct my_struct , node)

    的结果正是用户定义的结构的地址,将该地址赋给指针,就可以使用了。

    总之,此设计的关键是使用了宏和offsetof关键字,宏只是进行替换,与类型无关; 而offsetof又能由成员地址得到结构指针地址。

  • 相关阅读:
    HDU 6370 dfs+并查集
    牛客网暑期ACM多校训练营(第六场)G
    HDU 6351暴力枚举 6354计算几何
    2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 A,D
    2018 百度之星 初赛 第六题 HDU6349
    HDU 6336 子矩阵求和
    HDU 6333 莫队+组合数
    BZOJ 2308 莫队入门经典
    Linux系统管理第一章
    2019年7月17日
  • 原文地址:https://www.cnblogs.com/liujiahi/p/2196369.html
Copyright © 2011-2022 走看看