#define TEST(a,b) ((int) &((a*)0)->b )的解释

深信服笔试考了这个不会。查了下相关资料,记录一下。

a是某结构体类型

((a*)0)是把一个为0的int变量强转为a*类型

((a*)0)->b是取该指针的成员b

&((a*)0)->b是取成员b的地址

(int)&((a*)0)->b)是将b的地址强转为int。因为之前该指针是强转0来的,所以结构体地址为0,b的地址就是b在结构体中的偏移。

比如:

#include <iostream>
using namespace std;
//调用方式:
#define TEST(a,b) ((int) &((a*)0)->b )
struct A
{
    short a;
    char b;
    short c;
    int d;
};
struct B
{
    char a;
    short b;
    char c;
    int d;
};

int main()
{
    int ret=TEST(A,b);
    int ret2=TEST(B,c);
    cout<<ret<<" "<<ret2;
    getchar();
}

输出:2  4

第一行求类A中b成员的偏移,因为前面只有一个short a,所以为2

第二行求类B中c成员的偏移,前面成员a和b占三个字节,但由于结构体字节对齐,c要从第4字节开始,所以为4

posted @ 2020-03-25 19:59  NeoZy  阅读(382)  评论(0编辑  收藏  举报