我无法弄清楚这个宏意味着什么:
#define DECLARE_HANDLE(n) typedef struct n##__{int i;}*n
DECLARE_HANDLE(HWND);
我从 C 计划中了解到:
“##”表示连接参数。
所以宏等于:
typedef struct HWND__{int i;}*HWND
这是对的吗?
如果是对的,那句话的含义是什么?
==================
来自游戏Bombermaaan(适用于Windows和Linux)的代码,
链接http://sourceforge.net/p/bombermaaan/code/HEAD/tree/trunk/src/Bombermaaan/winreplace.h,
第90行。
答案 0 :(得分:11)
此构造的主要目的是防止滥用句柄。如果所有句柄只是void *
或int
或long long
或其他一些基本类型,则没有什么可以阻止您使用其中一个而不是另一个。指向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都是不可能的,因为编译器将反对“使用不完整类型”。
答案 1 :(得分:5)
你的假设是正确的。
您可以使用以下简单的测试代码进行检查。
DECLARE_HANDLE(HWND);
struct HWND__ s;
HWND p = (HWND) malloc(sizeof(struct HWND__));
s.i = 20;
p->i = 100;
cout << "i valueis " << s.i<<" and " << p->i <<endl;
答案 2 :(得分:1)
完全。
这用于声明指向您不知道的结构的不透明指针。
我不知道他们为什么不简单地将其声明为
typedef void* HWND;
可能是对齐问题,因为结构可以对齐但不是基本类型
如上所述,将类型声明为结构允许进行一些编译时类型检查
聪明!
答案 3 :(得分:0)
它将HWND
定义为指向包含struct HWND__
的{{1}}的指针。
因此,现在您可以在代码中使用类型int i
。
答案 4 :(得分:0)
DECLARE_HANDLE(HWND);
确实扩展为
typedef struct HWND__{int i;}*HWND;
现在,你问这意味着什么?只需将typedef拆分为两个步骤:
struct HWND__
{
int i;
};
typedef HWND__* HWND; // C++ only; for both C++ and C: typedef struct HWND__* HWND;
因此,它定义了一个包含HWND__
(名为int
)的结构i
,并将类型别名HWND
声明为指向HWND__
的指针