Getter for Windows handles
Getter for Windows handles
所以我已经学习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;
此定义的目的是防止不同类型的句柄之间的混淆,如果typedef
为WORD
、LONG
或DWORD
,则这些句柄都将只是整数。使它们指向不同的结构可以防止在不匹配的情况下进行编译。微软已经做了至少20年了。
您的IDE可能会查看调试信息,而不是解析头文件,并且它不会逆转typedef
的效果。
在C++中,struct
标记在当前命名空间中是隐式typedef
ed。因此struct HDC__
也创建了类型HDC__
。出于某种原因,IDE假设了这一点。如果您使用C++进行编译,那么这应该不是问题。如果你是用C编译的,那就太糟糕了,这个bug可能是你问题中最小的一个。
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 在Linux for Windows上编译C++代码时出错
- 在Windows上用C++裁剪HBITMAP
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- Windows/Cygwin - 不能使用 pybind11 - 犯错误
- Windows 10-使用gtkmm-3.0库和g++[包括再现]的分段故障
- 在Windows中以.exe的形式运行c++
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 无法在windows控制台中为C++程序提供必要的输入
- 在Windows中查找扬声器输出的当前音量级别
- Windows.h与GLFW.h的接口
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 在Linux和C++中的Windows上,散列字符串值会产生不同的输出
- 使用 std::unique_ptr 表示 Windows HANDLEs
- 如何在Windows HANDLEs中使用C++标准智能指针
- Getter for Windows handles