c++ - Windows 句柄的 Getter

标签 c++ windows winapi clion

所以我已经学习 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;

这个定义的目的是为了防止不同类型的句柄之间的混淆,如果 typedefed 为 WORDLONG,这些句柄都只是整数>,或 DWORD。使它们指向不同的结构可以防止在不匹配的情况下进行编译。 Microsoft 这样做至少已有 20 年了。

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

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

关于c++ - Windows 句柄的 Getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34387096/

相关文章:

c++ - 将基类的对象传递给派生类的引用函数

windows - 如何使用特定环境值运行 go get 命令?

python - 无法使用 Python 在 Windows 上找到具有长名称的文件

c++ - 如何使用 Win32/MFC API 提取 .iso 文件?

windows - 是什么导致 WriteFile 返回错误 38 (ERROR_HANDLE_EOF)?

c++ - 模拟按下的快捷方式

c++ - QT,运行特定时间的功能

c++ - C++中的字符串逻辑错误

c++ - 从字符串中提取 x、y、z 坐标?

windows - 从 SendMessage() + WM_COPYDATA 获取响应