额
看到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字的文章…