栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

[C++] intptr

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[C++] intptr

看到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 
#endif 
#endif 

深挖下去

#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__) 
#define __SIZEOF_INT128__ 16
#endif
#ifndef __SIZEOF_INT128__
typedef int __int128 __attribute__ ((__mode__ (TI)));
#endif
#endif
#endif 
#endif 

可以发现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字的文章…

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/879222.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号