Getter for Windows handles

Getter for Windows handles

本文关键字:handles Windows for Getter      更新时间:2023-10-16

所以我已经学习C++几个月了,我的IDE遇到了一个奇怪的问题。(Jetbrains CLion FTW!)

我的IDE可以为成员生成getter,自动确定类型、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返回句柄的例子时,它们通常只直接返回该句柄类型。

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

typedef const struct HDC__ *HDC;

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

typedef struct HDC__{int i;}*HDC;

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

您的IDE可能会查看调试信息,而不是解析头文件,并且它不会逆转typedef的效果。

在C++中,struct标记在当前命名空间中是隐式typedefed。因此struct HDC__也创建了类型HDC__。出于某种原因,IDE假设了这一点。如果您使用C++进行编译,那么这应该不是问题。如果你是用C编译的,那就太糟糕了,这个bug可能是你问题中最小的一个。