宏CONTAINING_RECORD的计算解析

C++ CONTAINING_RECORD 宏操作技巧学习 C++ 的CONTAINING_RECORD宏; 阅读详情
// 宏CONTAINING_RECORD的计算解析
// 宏CONTAINING_RECORD的作用是根据结构体中的某成员的指针来推算出该结构体的指针!
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
using namespace std;


#define CONTAINING_RECORD(address, type, field) ((type *)( \
(PCHAR)(address) - \
(ULONG_PTR)(&((type *)0)->field)))


// 命名含义:
// cr:CONTAINING_RECORD 
// Test:用来测试的
struct crTest
{
int m_nVal;
double m_dVal;
char m_cVal;
};








int main()
{
crTest cr;


// 现在假设我们知道了m_dVal的地址
PCHAR p = (PCHAR)(&cr.m_dVal);
cout << "cr.m_dVal=" << &cr.m_dVal << endl;


// 假设m_dVal在crTest中的偏移量为dLen,那么:
// &cr = &cr.m_dVal - dLen




// 如何求dLen呢
// 我们可以假设crTest的一个对象的地址值为0,这样就可以计算m_dVal的偏移量了
// 这个时候m_dVal的地址值实际就是偏移量
cout << "cr.m_dVal Offset=" << &(((crTest*)0)->m_dVal) << endl;


// 我们应该把他的偏移量转换成数字来计算,其实用int, unsigned, long都可以,不过为了防止偏移量过大溢出,所以用unsigned long
// 为什么要加上(crTest*)?后面解释
cout << "Calc one &cr=" << (crTest*)((PCHAR)&cr.m_dVal - (unsigned long)&(((crTest*)0)->m_dVal)) << endl;


// 为了64位32为的兼容性,我们应该用ULONG_PTR
cout << "Calc two &cr=" << (crTest*)((PCHAR)&cr.m_dVal - (ULONG_PTR)&(((crTest*)0)->m_dVal)) << endl;

// 好了,解释下前面为什么加(crTest*),看下不加(crTest*)的结果
cout << "Calc two &cr=" << (PCHAR)&cr.m_dVal - (ULONG_PTR)&(((crTest*)0)->m_dVal) << endl;


// 乱码了,其实是cout的问题,没法正确解析,
printf("%p\n", (PCHAR)&cr);


// 为了保险终极结果
cout << "Calc &cr=" << (crTest*)((PCHAR)&cr.m_dVal - (ULONG_PTR)&(((crTest*)0)->m_dVal)) << endl;


// 对比是否正确
cout << "&cr=" << &cr << endl;

// 结束了?等等,试下CONTAINING_RECORD
cout << "CONTAINING_RECORD = " << CONTAINING_RECORD(&cr.m_dVal, crTest, m_dVal);
system("pause");
return 0;
}
快手did did_gt edid的注册过程 接口 https://gdfp.ksapisrv.com/rest/infra/gdfp/report/kuaishou/android did 是本地生成的16进制 或者 获取的 android_id did_gt 是did生成时间戳 1595073601970 public static final Random f16237a = new Random(System.currentTimeMillis()); public static long m19668a() {  &n 阅读详情

相关推荐

(一)ANSYS WORKBENCH实践入门

ANSYS-workbench 有限元分析应用基础教程 (张晔)学习笔记

qq_51767372的博客 1万+

CONTAINING_RECORD宏原理与使用详解

先不急着说CONTAINING_RECORD宏,我们从最浅显的代码开始讲解。 一、0指针的妙用 0指针,即nullptr、NULL,空指针,是不是很常见,一遇到它往往就是segment fault。代码,如下: struct Test { int a; float b; }; Test* pTest = nullptr; int a_value = pTest->a; // segment fault int b_value = pTest->b; // segment fau

百里杨的博客 3413

ASPICE1-配置管理

SUP.8配置管理 BP1:开发配置管理策略 BP2:识别配置项 BP3:建立配置项管理系统 BP4:建立分支管理 BP5:控制变更和发布 BP6: 建立基线 BP7:报告配置项状态 BP8:验证配置项信息 BP9:管理配置项和基线的存储 1.配置管理概念 配置管理(Configuration Management,CM)是通过使用技术或行政手段对软件产品进行控制,以实现对软件开发过程和生命周期进行控制、规范的一系列措施。 完整性、一致性、可控性。 2.配置管理的主要活动: 1.

HDZQ2005的专栏 3687

CONTAINING_RECORD宏解析

CONTAINING_RECORD内容 这里分析一下这个CONTAINING_RECORD宏,该宏的作用是通过结构体类型内部某一成员的位置来获取该结构体的位置。结构体内容如下: // // Calculate the address of the base of the structure given its type, and an // address of a field within the structure. // #define CONTAINING_RECORD(address, t

輚至消亡 1161

VIPER22A实战:从零搭建15W非隔离电源,附BUCK电路调试心得

本文详细介绍了使用VIPER22A芯片从零搭建15W非隔离电源的全流程,重点解析BUCK电路设计与调试技巧。通过核心参数计算、PCB布局优化和效率提升方案,帮助工程师快速掌握DC-DC电源设计要点,实现高效稳定的电源转换。

redis7keeper的博客 669

无感FOC之高频注入法——永磁同步电机控制

1.摘要电机运行在低速或零速时,磁链产生的反电动势很微弱,可用信号的信噪比太低,因而难以从反电动势中提取转子的位置和速度信息。因而在电机处于低速或零速时,需要借助电机的凸极特性来获取转子的位置信息。内置式永磁同步电机或磁密较大的表贴式永磁同步电机具有这种凸极特性,可借助高频电压注入法获取转子位置。2.凸极特性凸极电机内部的气隙是不均匀的,d轴和q轴的有效气隙是不同的,通俗来说在凸极电机里,q轴电感往往大于d轴电感,而在大部分表贴式永磁同步电机,气隙分布相对均匀,q轴电感近似于d轴电感。凸极率常用q轴电感和d

qq_2545470942的博客 2万+

我对CONTAINING_RECORD宏的详细解释

tfref   宏CONTAINING_RECORD的用处其实还是相当大的, 而且很是方便, 它的主要作用是:    根据结构体中的某成员的地址来推算出该结构体整体的地址!  下面从一个简单的例子开始说起:  我们定义一个结构体, 同时类型化: typedef struct{ int a; int b; int c; }ss;   这是一个很简单的结构...

weixin_33919941的博客 345

基于单片机的智能温控风扇设计

该智能温控风扇系统的设计目标是根据环境温度自动控制风扇的转速或开关状态,确保用户始终处于舒适的温度范围内。实时温度监测:通过温度传感器(如DS18B20或DHT22)实时监控环境温度。风扇控制:根据温度变化自动调节风扇的转速,温度过高时风扇加速,温度适中时风扇转速降低,达到节能与舒适平衡。LCD显示:通过LCD屏幕实时显示温度信息。无线通信:通过Wi-Fi或蓝牙模块将温度数据发送至手机或云平台,支持远程控制风扇的开关或调节转速。报警功能:温度过高或过低时,蜂鸣器发出警报,提示用户注意。

2201_76125393的博客 1162

CONTAINING_RECORD宏的详细解释

我对CONTAINING_RECORD宏的详细解释 标签: C语言, 结构体 日期: 2013-01-07 分类: C&C++ 字号:  宏 CONTAINING_RECORD 的用处其实还是相当大的, 而且很是方便, 它的主要作用是:根据结构体中的某成员的地址来推算出该结构体整体的地址! 下面从一个简单的例子开始说起, 我们定义一个结构体, 同时类型化: typedef stru

zxy355的专栏 454

基于STM32F1XX 、HAL库的OPT4001-Q1环境光传感器驱动应用C语言程序设计

OPT4001-Q1 的输出是半对数 的,具有 9 个二进制对数满量程照度范围,每个范围内具有高度线性响应,使得 PicoStar™ 型号的测量能力为 312.5μlux 至 84klux,USON 型号的测量能力为 400µlux 至 107klux。// 禁用中断(示例)

PP_Cottage的博客 462

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

CONTAINING_RECORD宏

<br />#define CONTAINING_RECORD(address, type, field) ((type *)( (PCHAR)(address) - (ULONG_PTR)(&((type*)0)->field)))<br />class A<br />{<br />      char c;<br />      int a;<br />      short b;<br />}<br />int a = 100;<br />int *pInt = &a;<br />比如,我调用了 CO

jian_275的专栏 1400

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

CONTAINING_RECORD宏的使用

在看IOCP模型中看到一个CONTAINING_RECORD宏,用于根据一个结构体的一个成员获取这个结构体的首地址。 宏定义如下  #define CONTAINING_RECORD(address, type, field) ((type *)( \                                                   (PCHAR)(address) - \  ...

HLW0522的博客 489

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

对CONTAINING_RECORD的理解

晚上有个同学给小C提了个问题:小C觉得还蛮典型的,发篇日志交流一下吧~ 问题如下: Device Development Kit里的一个宏 #define CONTAINING_RECORD(address, type, field) ((type *)( \ (PCHAR)(address) - \ (ULONG_PTR)(&((type *)0)->field

木棉花开时,凤凰涅槃日! 495

CONTAINING_RECORD

CONTAINING_RECORD 这样的一个宏,我看了它的定义,如下:define CONTAINING_RECORD(address, type, field) ((type )( (PCHAR)(address) - (ULONG_PTR)(&((type)0)->field)))class A { char c; int a; short b;

阿桀的博客 255

(ULONG_PTR)(&((type *)0)->field))) 的解释

最近看到一个宏 #define CONTAINING_RECORD(address, type, field) ((type *)( \                                                   (PCHAR)(address) - \                                                   (ULONG_

woshiyuanlei的专栏 1696

结构体指针和结构体成员指针

在添加sqlite3的加解密功能函数时,由于网上资料针对的版本是旧版sqlite3源码,现在新版上做修改遇到了一个宏,该宏是旧版上的,它作用是由结构体成员指针pData找到它所属的结构体指针。下面转的文章详解了这种机制。 1.通过结构体成员指针寻找其所属结构体指针 转自http://blog.youkuaiyun.com/mycwq/article/details/9327743 宏CONTAINING...

weixin_30241919的博客 189

CONTAINING_RECORD的用法

在学习IOCP中的时候,看到了这个宏定义,感觉这样解释还不错吧。 宏CONTAINING_RECORD的用处其实还是相当大的, 而且很是方便, 它的主要作用是:     根据结构体中的某成员的地址来推算出该结构体整体的地址!   下面从一个简单的例子开始说起:   我们定义一个结构体, 同时类型化: typedef struct{ int a; int b;

zs10hz的专栏 2185

CONTAINING_RECORD _CR 宏理解

在EFI中常常遇到下面这个宏,他的作用是  // //  CONTAINING_RECORD - returns a pointer to the structure //      from one of it's elements. // #define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR

bailin2010的专栏 1027

C++小技巧之CONTAINING_RECORD

CONTAINING_RECORD Containing record是一个在C++编程中用处很大的一种技巧,它的功能为已知结构体或类的某一成员、对象中该成员的地址以及这一结构体名或类名,从而得到该对象的基地址。 由于写法简单,它被当做一个宏来使用,写法是这样的。 #define CONTAINING_RECORD(address,type,field) \ ((type*)((PCHA...

766

详细分析CONTAINING_RECORD宏

 该宏的作用是:用结构成员中的ListEntry的地址(0x108)减去结构体成员ListEntry到首地址的距离(8)得到结构体首地址(0x100)     pEntry 中的值就是结构成员中的ListEntry的地址。即:0x108 ListEntry 0x108 结构成员中的ListEntry的地址,也是RemoveHeadList函

Jiangkai.net 938

CONTAINING_RECORD宏的含义

文章来源:http://www.cnblogs.com/satng/archive/2012/08/23/2652723.html CONTAINING_RECORD 这样的一个宏,我看了它的定义,如下: #define CONTAINING_RECORD(address, type, field) ((type *)( (PCHAR)(address) - (ULONG_PTR)(&((ty

$firecat利白的代码足迹$ 1025

宏CONTAINING_RECORD学习

宏CONTAINING_RECORD的用处其实还是相当大的, 而且很是方便, 它的主要作用是:     根据结构体中的某成员的地址来推算出该结构体整体的地址!   下面从一个简单的例子开始说起:   我们定义一个结构体, 同时类型化: typedef struct{ int a; int b; int c; }ss;   这是一个很简单的结构体, 没什

ghevinn欢迎您光临 1199
上一篇: 数组、模板、引用(C++ primer)
下一篇: InvokeHelper调用引发异常
QSCJOB
博客等级 码龄15年 17粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值