#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
进击的小🐴农