#define IOFFSETOF(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

#include <iostream>

#define IOFFSETOF(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

using namespace std;

int main(){

    struct Demo{
        char sex;
        int  id;
    };

    cout << "IOFFSETOF(Demo, sex): " << IOFFSETOF(Demo, sex) << endl;
    cout << "IOFFSETOF(Demo,  id): " << IOFFSETOF(Demo,  id) << endl;
    return 0;
}

输出:

#define IOFFSETOF(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

1.(TYPE*)0   将0强转为TYPE类型的指针,此时0作为一个匿名结构体的的起始地址。

2.(TYPE*)0->MEMBER 指向结构体中的MEMBER成员。

3.&((TYPE*)0->MEMBER) 获取MEMBER成员在结构体的地址,因为起始为0,所以获取的地址为相对偏移地址。

结论:这个宏用于获取结构体中某个数据成员MEMBER在结构体中相对偏移地址。

猜你喜欢

转载自www.cnblogs.com/iuyy/p/13391851.html