有个宏定义如下:
#define FIELD_OFFSET(type, field) ((LONG)(INT_PTR)&(((type *)0)->field))
我左看右看,看不懂,这个宏究竟干嘛用的.请大侠指点指点.
这个宏的含义是不是先把 0转换为(type*) 类型,然后取域 field ,对NULL指针进行操作不会引起异常么?
#define FIELD_OFFSET(type, field) ((LONG)(INT_PTR)&(((type *)0)->field))
我左看右看,看不懂,这个宏究竟干嘛用的.请大侠指点指点.
这个宏的含义是不是先把 0转换为(type*) 类型,然后取域 field ,对NULL指针进行操作不会引起异常么?
解决方案 »
- (祝大家新年好,顺便解答一个)图片没有正确地伴随着滚动条而改变的问题
- VC ADO连接SQL2005(迷茫一周了)
- vc里用ado ,_RecordsetPtr时 对sql 查询语句 有限制吗?
- 如何快速进行数组之间的赋值移动??
- 如何COPY文件?谢谢!
- 关于ActiveX控件的注册问题?(200分相送)
- 菜鸟提问:vc写的程序别人不能用 会是什么情况?
- ∮●●急救!十万火急!求解决一问题,一个程序调用同一个dll两次出现dll里面的全局变量互相影响
- 请问:如何在98下使程序窗体透明??
- VC6.0中是否可以调用webservice
- 为什么WM_PAINT消息无休无止?
- 在win32 console Application中-〉an application that supports MFC里的socket question,please help
因为是宏替换,由编译器计算偏移,所以不会生成访问0(NULL)地址的指令,不引起异常
假设有
struct {
BYTE a;
BYTE b;
BYTE c;
}demo_t;
计算LONG offset = FIELD_OFFSET(demo_t, c)替换之后就变为
offset = ((LONG)(INT_PTR)&(((demo_t*)0)->c));
编译器再次展开时首先计算c相对于(demo_t*)的偏移为2(编译器肯定知道),然后&操作符取相对于0的地址也等于2,最后再转换成LONG,结果就得2,刚好是c的偏移
但是我对下面的运行结果感觉很疑惑typedef struct { BYTE a;
REFERENCE_TIME b;
BYTE c[1];
}demo_t;
TRACE("FIELD_OFFSET(demo_t,a) %d \n", FIELD_OFFSET(demo_t,a));
TRACE("FIELD_OFFSET(demo_t,b) %d\n", FIELD_OFFSET(demo_t,b));
TRACE("FIELD_OFFSET(demo_t,c) %d\n", FIELD_OFFSET(demo_t,c));
TRACE("FIELD_OFFSET(demo_t,c[10]) %d\n", FIELD_OFFSET(demo_t,c[10]));
TRACE("FIELD_OFFSET(AM_SAMPLE2_PROPERTIES,dwTypeSpecificFlags) %d \n", FIELD_OFFSET(AM_SAMPLE2_PROPERTIES,dwTypeSpecificFlags));运行的结果是FIELD_OFFSET(demo_t,a) 0
FIELD_OFFSET(demo_t,b) 8
FIELD_OFFSET(demo_t,c) 16
FIELD_OFFSET(demo_t,c[10]) 26FIELD_OFFSET(AM_SAMPLE2_PROPERTIES,dwTypeSpecificFlags) 4 ??????这个值为什么是4 而不是8呢?typedef struct tagAM_SAMPLE2_PROPERTIES {
DWORD cbData;
DWORD dwTypeSpecificFlags;
DWORD dwSampleFlags;
LONG lActual;
REFERENCE_TIME tStart;
REFERENCE_TIME tStop;
DWORD dwStreamId;
AM_MEDIA_TYPE *pMediaType;
BYTE *pbBuffer;
LONG cbBuffer;
} AM_SAMPLE2_PROPERTIES;
typedef struct { BYTE a;
REFERENCE_TIME b;
BYTE c[1];
BYTE cc;
BYTE ccc;
BYTE cccc;
//BYTE ccccc;
DWORD d;
}demo_t;
的长度便是 24 但是对于结构
typedef struct { BYTE a;
REFERENCE_TIME b;
BYTE c[1];
BYTE cc;
BYTE ccc;
BYTE cccc;
BYTE ccccc;
DWORD d;
}demo_t;
他的长度便是32。大伙可以生成一个对象,给它负值,然后在memory 窗口里看这个变量的
结构就可以一目了然了