所以我已经学习 C++ 几个月了,我在使用 IDE 时遇到了一件奇怪的事情。 (Jetbrains CLion FTW!)
我的 IDE 可以为成员生成 getter,自动确定类型、const 与否以及其他关键字。显然这一代并不完美,所以我发现自己通常不会使用这个功能。所以目前我专注于 Windows API,它需要使用句柄。因此,当我为句柄(HINSTANCE、HWND、HDC 等)生成 setter/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;
这个定义的目的是为了防止不同类型的句柄之间的混淆,如果 typedef
ed 为 WORD
或 LONG
,这些句柄都只是整数>,或 DWORD
。使它们指向不同的结构可以防止在不匹配的情况下进行编译。 Microsoft 这样做至少已有 20 年了。
您的 IDE 可能会查看调试信息而不是解析头文件,并且它不会反转 typedef
的效果。
在 C++ 中,struct
标记在当前命名空间中隐式 typedef
。所以 struct HDC__
也创建了类型 HDC__
。出于某种原因,您的 IDE 会这样假设。如果您正在编译为 C++,那应该不是问题。如果您正在编译为 C,太糟糕了,这个错误可能是您问题中最少的。
关于c++ - Windows 句柄的 Getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34387096/