offsetof(#define offsetof(s,m) (size_t)&(((s*)0)->m) 请高手详解上述宏定义的所作的工作)
本文目录
- #define offsetof(s,m) (size_t)&(((s*)0)->m) 请高手详解上述宏定义的所作的工作
- linux offsetof 在哪个头文件
- offsetof函数什么意思啊
- #define offsetof(TYOE,MEMBER) ((int)&((TYPE *)0)->MEMEBER)这个该怎么理解啊
#define offsetof(s,m) (size_t)&(((s*)0)->m) 请高手详解上述宏定义的所作的工作
这里定义的是,一个宏,用宏来实现函数的功能。如果你在下面调用了offsetof(2,4);他就等于(size_t)&(((2*)0)-》4) ;宏定义的这样方式,编译阶段不对函数的参数进行检查,所以这样是一种很不好的用法,
linux offsetof 在哪个头文件
有的。我们可以将linux/kernel.h头文件包含进来,直接在用户空间测试这个宏的巧妙...那个__compiler_offsetof原型是__builtin_offsetof这个是GCC编译器所特有的。
be shown a heap of paper and you will look f
offsetof函数什么意思啊
offsetof宏的简介定义 在stddef.h头文件中,该宏的完整说明如下: #ifdef __cplusplus #ifdef _WIN64 #define offsetof(s,m) (size_t)( (ptrdiff_t)&reinterpret_cast《const volatile char&》((((s *)0)-》m)) ) #else #define offsetof(s,m) (size_t)&reinterpret_cast《const volatile char&》((((s *)0)-》m)) #endif #else #ifdef _WIN64 #define offsetof(s,m) (size_t)( (ptrdiff_t)&(((s *)0)-》m) ) #else #define offsetof(s,m) (size_t)&(((s *)0)-》m) #endif #endif /* __cplusplus */功能 该宏用于求结构体中一个成员在该结构体中的偏移量。 在msdn上,该宏被写作: size_t offsetof( structName, memberName ); 第一个参数是结构体的名字,第二个参数是结构体成员的名字。该宏返回结构体structName中成员memberName的偏移量。偏移量是size_t类型的。本段程序示例 #include 《stdio.h》 #include 《stddef.h》 typedef struct { int iVal; int iVal2; }Test; typedef struct { char ch; int iNum; }Test2; int main(void) { Test t = {1, 2}; Test2 t2 = {’t’, 100}; printf("\naddress of t : %p\naddress of t.iVal : %p\naddress of t.iVal2: %p\n\n", &t, &(t.iVal), &(t.iVal2)); printf("offset of iVal in t: %p\n", offsetof(Test, iVal)); printf("offset of iVal2 in t: %p\n", offsetof(Test, iVal2)); printf("\naddress of t2 : %p\naddress of t2.ch : %p\naddress of t2.iNum: %p\n\n", &t, &(t2.ch), &(t2.iNum)); printf("offset of ch in t2: %p\n", offsetof(Test2, ch)); printf("offset of iNum in t2: %p\n", offsetof(Test2, iNum)); return 0; } 在VS2005中输出: address of t : 0012FF10 address of t.iVal : 0012FF10 address of t.iVal2: 0012FF14 offset of iVal in t: 00000000 offset of iVal2 in t: 00000004 address of t2 : 0012FF10 address of t2.ch : 0012FF00 address of t2.iNum: 0012FF04 offset of ch in t2: 00000000 offset of iNum in t2: 00000004 需要注意的是,Test2中iNum成员的偏移量
#define offsetof(TYOE,MEMBER) ((int)&((TYPE *)0)->MEMEBER)这个该怎么理解啊
这个表达式分两部分看,首先确定运算符的优先级,在上面的表达式中,-》最高,&取地址次之,(类型)类型转换最低,故可以这么看:1.(int)&(...),表示将右边括号内的先取地址,然后将地址的值强制转换为int型;2.要引用常数地址0的变量,在C语言中是不允许的,必须进行类型转换,故((TYPE *)0)是将地址0强制转换为TYPE结构提类型的指针,((TYPE *)0)-》MEMEBER则就是引用地址0处的TYPE结构提体的变量MEMEBER,3.结合第1和第2点,慢慢理解,希望对你有用
更多文章:
监控设备图片(有一种科技设备能远程监控别人,还能知道对方大脑在想什么,这种设备叫什么名字)
2023年10月7日 19:00
凌晨三点电影免费看(半夜电话响了,是家里人打来的,接电话的前三秒是什么心情)
2024年4月29日 22:20
K246列车要经过哪些站?德阳K246到三门峡的火车能在西安下吗
2023年12月12日 10:50
海信邮箱手机登录(海信电视led42k360x3d电子邮箱怎么输入)
2024年7月20日 15:48
创维t868(SKYWORTH创维T868怎么改成安卓系统能改么)
2024年9月16日 00:25
中国移动和包app官方下载(怎样通过和包支付软件给自己的电话号码充话费)
2024年6月29日 10:01
原道m9i刷机(原道m9i刷机电脑用32位系统还是64位呢!每次93%就卡住了)
2023年12月15日 15:30
pcie固态硬盘怎么样(固态硬盘有什么优势,现阶段PCIe 4.0和3.0怎么选,致态怎么样)
2023年2月21日 10:45
苹果4和4s拍照对比(苹果4和4s实用效果究竟差多少实际拍照效果差距大吗)
2024年5月4日 10:35
显卡GTX580和RX580那个好?580显卡配什么cpu 这个建议还是很客观的
2024年7月23日 09:18