宏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;
}
基于小波变换的信号降噪处理及仿真研究_信号处理方法推荐--1(转载自用,侵删)... 综述作者:aresmiki链接:https://www.zhihu.com/question/23701194/answer/167005497来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。非平稳信号处理应该是现在信号处理技术最新的也是最热的研究方向了,信号处理方法从最早的时域统计到傅里叶变换的频域分析,是人们认识信号本质的一次巨大飞跃,给了分析人员换个角度看世界的... 阅读详情

相关推荐

RK3576平台Buildroot嵌入式Linux镜像构建实战

嵌入式Linux镜像构建是连接硬件能力与软件功能的核心技术环节,其本质是基于目标SoC架构的交叉编译、内核定制与根文件系统集成过程。原理上依赖工具链适配、设备树绑定、分区镜像生成等关键步骤,技术价值在于实现轻量、确定、可复现的系统交付。典型应用场景涵盖ARM64开发板(如RK3576)、工业边缘网关及国产化信创终端。本文以TaishanPi-3为载体,深入解析Buildroot在RK3576平台上的配置裁剪、并行编译优化、genimage分区合成及update.img烧录准备,覆盖从环境选型(Ubuntu

weixin_36047538的博客 140

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

Cadence数模混合仿真实战:从Verilog到ADE L的完整流程解析

本文详细解析了Cadence数模混合仿真的完整流程,从Verilog代码编写到ADE L仿真环境配置。通过实战案例讲解如何创建Config文件、搭建混合信号原理图,并分享提高仿真效率的技巧和常见问题排查方法,帮助工程师掌握这一关键芯片设计验证技术。

weixin_29246195的博客 986

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

Tomcat启动过程中cmd窗口(控制台)中文乱码的问题

tomcat启动时,启动过程日志中文乱码的处理方法。

寻码启示 1945

VASP吸附计算1:CO在Pt(111)面的吸附|Materials Studio建模

介绍用VASP计算CO-Pt体系电荷密度的流程。

weixin_50519490的博客 5945

我对CONTAINING_RECORD宏的详细解释

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

weixin_33919941的博客 345

vrep小车避障算法_V-REP 多车道巡线与避障

任务概要在给定的赛道中,实现多车道的避障和视觉巡线。避障算法没有限定,可使用人工势场、RRT等路径规划算法。车体大小、赛道信息以及参考资料在此处下载。完成情况已学习并能初步使用 V-REP Python Remote API 接口,实现 Python 与 V-REP 的功能交互。已实现基于视觉传感器的多车道巡线功能。已实现基于视觉传感器的多车道避障功能。V-REP Python Remote AP...

weixin_39692037的博客 1834

CONTAINING_RECORD宏的详细解释

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

zxy355的专栏 454

【如何利用扩展卡尔曼滤波解决跟踪毫米波雷达目标】

笛卡尔坐标系(非极坐标系):使用两个垂直的轴(通常是x轴和y轴)来确定一个点的位置。你沿着这两个轴移动确定的距离来找到这个点。极坐标系:使用一个角度和一个距离来确定一个点的位置。首先,你转到一个特定的方向(角度),然后沿着那个方向移动确定的距离来找到这个点。希望这个例子能帮助你理解两种坐标系的基本概念!

小秋 AI SLAM 入门实战教程 885

信贷模型域——清收阶段模型(贷后模型)

本文深入探讨了信贷模型域中的清收阶段模型(贷后模型),涵盖早期催收模型(C卡)、晚期催收模型、Best Time to Contact模型和回收模型。这些模型通过多维度数据输入,运用分类、回归和生存分析等建模方法,输出关键指标如还款概率、回收率等,广泛应用于银行、资产管理公司和催收外包公司,助力提升回款率、优化资源分配、降低催收成本,并融入贷后风控体系。

庄小焱 653

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

【OpenCV】图像的像素直方图 图像特征点 cv::FAST cv::ORB ORB_SLAM2::ORB

文章目录图像直方图代码实现cv::FAST和cv::ORB 检测图像特征点cv::FAST和cv::ORB 检测图像特征点代码实现ORB_SLAM2::ORB和自己实现ORB图像特征点检测效果对比ORB_SLAM2::ORB和自己实现ORB图像特征点检测效果对比代码实现 图像直方图代码实现 图像是由不同数值(颜色)的像素构成的,像素值在图像中的分布情况是图像的重要属性,可以用直方图修改图像的外观,标识图像的内容,检测图像中特定的物体或纹理。 单通道灰度图像中每个像素都有一个 0(黑色)-255(白色)的整

小秋 AI SLAM 入门实战教程 2510

CONTAINING_RECORD宏的使用

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

HLW0522的博客 489

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

对CONTAINING_RECORD的理解

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

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

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

(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、付费专栏及课程。

余额充值