我不明白这个宏的含义:
#define DECLARE_HANDLE(n) typedef struct n##__{int i;}*n
DECLARE_HANDLE(HWND);
我从中学到了C程序:
“##”表示连接参数。
所以宏等于:
typedef struct HWND__{int i;}*HWND
这是正确的吗?
如果是的话,那这句话的含义是什么?
=================
来自游戏 Bombermaaan 的代码(适用于 Windows 和 Linux),
link http://sourceforge.net/p/bombermaaan/code/HEAD/tree/trunk/src/Bombermaaan/winreplace.h http://sourceforge.net/p/bombermaaan/code/HEAD/tree/trunk/src/Bombermaaan/winreplace.h,
第 90 行。
该构造的主要目的是防止误用句柄。如果所有句柄都是简单的void *
or int
or long long
或其他一些基本类型,没有什么可以阻止您使用其中一种而不是另一种。一个指向a的指针struct HWND__
并指向struct HBITMAP__
不是同一件事,所以如果您有以下代码:
HWND hwnd;
HBITMAP hbmp;
hbmp = GetBitmap(...);
hwnd = hbmp; // gives compiler error.
这是一种相当经典的技术,可确保您获得 API 供应商不想提供真实声明的内容的唯一类型。尽管我不完全确定为什么他们甚至需要正确的结构声明,但您可能会逃脱:
#define DECLARE_HANDLE(n) struct n ## __; struct n ## __ *n;
这也将确保任何取消引用 HWND 都是不可能的,因为编译器将反对“使用不完整类型”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)