[C++] intptr_t

本文详细探讨了Windows消息处理中使用WPARAM和LPARAM整数类型的惊奇之处,展示了如何通过intptr_t将整数转换为地址,并以实例演示了如何用在事件处理结构体和函数中,揭示了底层内存操作的秘密。
摘要由CSDN通过智能技术生成

看到windows的消息处理函数,使用的WPARAM和LPARAM竟然是整数,觉得十分惊讶
(因为lParam可以转化为HWND(WM_COMMAND限定)和CREATESTRUCT(WM_CREATE限定))

typedef UINT_PTR WPARAM;
typedef LONG_PTR LPARAM;
typedef LONG_PTR LRESULT;

整数能储存地址吗?
还真能

intptr_t

先来观摩一下在corecrt.h里的定义

#ifndef _INTPTR_T_DEFINED
#define _INTPTR_T_DEFINED
#ifndef __intptr_t_defined
#define __intptr_t_defined
#undef intptr_t
#ifdef _WIN64
__MINGW_EXTENSION typedef __int64 intptr_t;
#else
typedef int intptr_t;
#endif /* _WIN64 */
#endif /* __intptr_t_defined */
#endif /* _INTPTR_T_DEFINED */

深挖下去

#ifndef _INT128_DEFINED
#define _INT128_DEFINED
#ifdef __GNUC__
#define __int8 char
#define __int16 short
#define __int32 int
#define __int64 long long
#ifdef _WIN64
#if (__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 1)) && \
    !defined(__SIZEOF_INT128__) /* clang >= 3.1 has __int128 but no size macro */
#define __SIZEOF_INT128__ 16
#endif
#ifndef __SIZEOF_INT128__
typedef int __int128 __attribute__ ((__mode__ (TI)));
#endif
#endif
#endif /* __GNUC__ */
#endif /* _INT128_DEFINED */

可以发现intptr_t就是一个long long(Win64限定)

代码

OK,前情提要结束了,来看看怎么用
首先模仿windows.,写一个结构体

struct Event
{
	int id;
	int event;
};

这个结构体包含了控件(假设有)的身份(id)和事件(event)
接下来写一个接受事件函数

void onEvent(int wp,int lp)
{
	Event* e = (Event*)wp;
	cout << dec << "id:" << e->id << "\tevent:" << e->event << endl;
}

也很简单,直接把int转化为Event*
最后在main()里面调用一下

Event e = {10,20};
cout << &e << "\t" << hex << (intptr_t)&e << endl;
onEvent((intptr_t)&e,0);

就能看到输出

0x71feb8        71feb8
id:10   event:20

--------------------------------
Process exited after 0.5406 seconds with return value 0
请按任意键继续. . .

可以看到成功了

最后

就一类型转换竟然水了一篇1400字的文章…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值