获取结构体某成员偏移
2010-10-29 23:43
274 查看
本身这个问题非常简单,直接用地址差值即可求得,最近在某本书上看到了一个非常牛的方法,第一次看还将信将疑觉得不太可能,后面上机验证发现确实可以,代码如下:
仔细看第14行代码,发现这个宏非常奇怪,没错,就是用来求偏移的。我们知道宏的本质是替换,在预编译的时候会替换代码,那么里面有什么玄机了?我发现其实此法是用了欺骗编译器的技巧来求得偏移的。取地址符‘&’决定表达式不会出现访问内存错误,因为默认0强制转化为结构体指针类型后是不能访问的地址,由于有地址符,所以不会实际产生访问变量的代码。而‘->’最本质的就是队0加上后面变量在结构体中的偏移,这样 “0 + 偏移”就求得了我们要求的值。感觉此代码非常巧妙,虽然不免有人说是愚弄编译器的伎俩,但是记下无妨,仍然觉得此法的甚妙。
#include <iostream> using namespace std; struct test { int a; int b; char c; int d; }; #define FIND(structTest,e) (size_t)&(((structTest*)0)->e) int main() { size_t s = FIND(test,b); //test t; cout<<s<<endl; char c; cin>>c; return 0; }
仔细看第14行代码,发现这个宏非常奇怪,没错,就是用来求偏移的。我们知道宏的本质是替换,在预编译的时候会替换代码,那么里面有什么玄机了?我发现其实此法是用了欺骗编译器的技巧来求得偏移的。取地址符‘&’决定表达式不会出现访问内存错误,因为默认0强制转化为结构体指针类型后是不能访问的地址,由于有地址符,所以不会实际产生访问变量的代码。而‘->’最本质的就是队0加上后面变量在结构体中的偏移,这样 “0 + 偏移”就求得了我们要求的值。感觉此代码非常巧妙,虽然不免有人说是愚弄编译器的伎俩,但是记下无妨,仍然觉得此法的甚妙。
相关文章推荐
- 获取结构体某成员偏移
- 获取结构体/类 中成员偏移, 另类获取私有成员
- 如何获取结构体某成员的偏移地址
- C和指针之结构体大小和成员变量位置距离结构开始存储的位置偏移字节
- 与struct相关的宏定义(成员变量偏移和获取struct起始地址)
- c++::获取结构体中某 个成员相对结构体起始位置的偏移
- C编译器剖析_5.2.3 中间代码生成及优化_通过“偏移”访问数组元素和结构体成员
- MDX Cookbook 01 - Skipping Axis 合理使用空的 SET 集合获取全部层次结构成员
- 用offsetof 计算成员变量的偏移,用member_to_object获取容器对象基址
- 与struct相关的宏定义 --- 根据成员变量偏移,获取struct起始地址
- c语言 获取结构体成员偏移量方法
- 结构体获取成员偏移值、结构体内存中字节对齐问题
- 通过成员变量地址获取结构体地址
- 计算结构/类中的数据成员的偏移
- 如何通过结构中的某个成员地址获取结构本身的指针???
- 从结构体成员获取结构体地址的方法
- 如何获取结构体某成员的偏移地址
- C++如何获取类成员的偏移
- ANSI C中获取结构体成员偏移量量的办法
- 利用宏来求结构体成员偏移值