C++ 如何向前声明句柄?(Win32)

C++ 如何向前声明句柄?(Win32),c++,c,winapi,C++,C,Winapi,如何转发声明句柄?我不想在这个特定的标题中包含所有的windows.h。看来我自己回答了这个问题。我只是把ed包括进去,而不是现在的。如果有人有办法,我仍然希望能够转发declare just HANDLE。实际键入defsHANDLE的标题是winnt.h。不幸的是,这是15K行-在这里,因此通过包括slimlinewindef.h来解决您的问题有点误导 这是我的系统上的相关部分(很明显,细节可能会随着版本的不同而变化,但在实现级别不会改变,因为这会破坏现有的二进制文件): PS一定会喜欢这个

如何转发声明
句柄
?我不想在这个特定的标题中包含所有的
windows.h

看来我自己回答了这个问题。我只是把ed
包括进去,而不是现在的
。如果有人有办法,我仍然希望能够转发declare just HANDLE。

实际键入defs
HANDLE
的标题是
winnt.h
。不幸的是,这是15K行-在这里,因此通过包括slimline
windef.h
来解决您的问题有点误导

这是我的系统上的相关部分(很明显,细节可能会随着版本的不同而变化,但在实现级别不会改变,因为这会破坏现有的二进制文件):


PS一定会喜欢这个
#如果0
出现在这个发布的Microsoft头文件中。

不是
#定义句柄int
还不够吗?@ruslik:HANDLE不是
int
。特别是,我认为它与指针的宽度相同。实际上,它是内核空间中某些表的索引。不管怎样,您不需要对它执行任何算术运算。这是性能关键的代码吗?或者使用pimpl包装
HANDLE
?因为这比试图从Windows API正向声明不透明类型要干净得多。@Ruslik:不总是这样。像窗口句柄这样的东西根本与内核无关@詹姆斯:这并不完全是性能上的关键,但仅仅为了暴露句柄而包含那个巨大的标题似乎是一种浪费。我原以为这只是一个
void*
,但我很好奇是否有一种公认的方法可以做到这一点。Windows是一个固定的永久ABI。它不是一个开放的标准,也不是一个需要考虑到不同实现的可移植性的标准。我也这么做了,但是我从
winnt.h
中得到了大量的编译器错误。知道为什么吗?
//
// Handle to an Object
//

#ifdef STRICT
typedef void *HANDLE;
#if 0 && (_MSC_VER > 1000)
#define DECLARE_HANDLE(name) struct name##__; typedef struct name##__ *name
#else
#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name
#endif
#else
typedef PVOID HANDLE;
#define DECLARE_HANDLE(name) typedef HANDLE name
#endif
typedef HANDLE *PHANDLE;