这行C / C ++预处理器意味着什么?

时间:2010-08-07 07:12:39

标签: winapi visual-c++ preprocessor

这是WinNT.h的第519行(BUILD版本:0091)

#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name

为什么我们需要一个指向结构的指针,该结构具有一个名为unused的奇怪名称的int成员?

我们是否需要使用像这样的一行代码?

HINSTANCE hInstance = new HINSTANCE__;

总体上声明具有相同结构的不同数据类型对我来说没有意义。这背后的想法是什么?

DECLARE_HANDLE(HRGN);
DECLARE_HANDLE(HRSRC);
DECLARE_HANDLE(HSPRITE);
DECLARE_HANDLE(HLSURF);
DECLARE_HANDLE(HSTR);
DECLARE_HANDLE(HTASK);
DECLARE_HANDLE(HWINSTA);
DECLARE_HANDLE(HKL);

3 个答案:

答案 0 :(得分:11)

关键是不同的句柄具有不同的类型,例如,HINSTANCE不能分配给HANDLE。如果它们都被定义为“void *”,那么编译器无法检测到错误类别。

答案 1 :(得分:1)

  

我们是否需要使用像这样的一行代码?
  HINSTANCE hInstance = new HINSTANCE __;

您通常使用Windows系统调用返回的HINSTANCE值;我从来没有看到代码执行这样的行。

答案 2 :(得分:1)

他们实际上并没有指出任何记忆;它们仅用于在调用Windows API时引用对象(文件,资源,信号量,窗口)。虽然它们只不过是内核对象表的索引,但开发人员决定将它们作为指向未使用结构的指针,这将使它们“不透明”并减少其他类型之间的混淆。 DECLARE_HANDLE是一个函数宏,它就是这样做 - 为句柄声明不透明的类型。

相关问题