Getter Windows 个句柄

Getter for Windows handles

所以我已经学习 C++ 几个月了,我 运行 和我的 IDE 发生了一件奇怪的事情。 (Jetbrains CLion FTW!)

我的IDE可以为成员生成getters,自动判断类型,是否const等关键字。显然这一代并不完美,所以我发现自己通常不会使用这个功能。所以目前我专注于 Windows API,这需要使用句柄。因此,当我为句柄(HINSTANCE、HWND、HDC 等)生成 getter 时,会发生一些非常奇怪的事情。

假设我有一个成员定义如下:

HDC m_hDeviceContext;

然后当我的 IDE 生成一个 getter 时,它看起来像这样:

const HDC__* getDeviceContext() const...

我很困惑为什么类型是 HDC__。它是一个指针是有道理的,因此句柄在 winnt.h.

中被声明为指针 (typedef struct name##__ *name)

谁能告诉我为什么会发生这种情况?这是我的 IDE 的错误吗,因为每当我看到 getter 的例子时 return 一个句柄,他们通常只是 return 直那个句柄类型。

HDC 定义为不透明 struct 指针的 typedef

typedef const struct HDC__ *HDC;

或在较旧的 windows 版本中作为从 DECLARE_HANDLE(HDC) 扩展的虚拟类型:

typedef struct HDC__{int i;}*HDC;

此定义的目的是为了防止不同类型句柄之间的混淆,如果 typedef 编辑为 WORDLONG 或 [=19=,则这些句柄都只是整数].使它们指向不同的结构可以防止在不匹配的情况下进行编译。微软已经这样做了至少 20 年。

你的IDE可能是查看调试信息而不是解析头文件,它并没有逆转typedef.

的效果

在 C++ 中,struct 标记在当前命名空间中隐式 typedefed。所以 struct HDC__ 也创建了类型 HDC__。出于某种原因,您的 IDE 假定了这一点。如果您正在编译为 C++,那应该不是问题。如果您正在编译为 C,太糟糕了,这个错误可能是您问题中最少的。