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
编辑为 WORD
或 LONG
或 [=19=,则这些句柄都只是整数].使它们指向不同的结构可以防止在不匹配的情况下进行编译。微软已经这样做了至少 20 年。
你的IDE可能是查看调试信息而不是解析头文件,它并没有逆转typedef
.
的效果
在 C++ 中,struct
标记在当前命名空间中隐式 typedef
ed。所以 struct HDC__
也创建了类型 HDC__
。出于某种原因,您的 IDE 假定了这一点。如果您正在编译为 C++,那应该不是问题。如果您正在编译为 C,太糟糕了,这个错误可能是您问题中最少的。
所以我已经学习 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
编辑为 WORD
或 LONG
或 [=19=,则这些句柄都只是整数].使它们指向不同的结构可以防止在不匹配的情况下进行编译。微软已经这样做了至少 20 年。
你的IDE可能是查看调试信息而不是解析头文件,它并没有逆转typedef
.
在 C++ 中,struct
标记在当前命名空间中隐式 typedef
ed。所以 struct HDC__
也创建了类型 HDC__
。出于某种原因,您的 IDE 假定了这一点。如果您正在编译为 C++,那应该不是问题。如果您正在编译为 C,太糟糕了,这个错误可能是您问题中最少的。