我可以#include定义DWORD的最小Windows头文件是什么?

j_r*_*ker 13 c windows header

我有一个我自己的小头文件,它声明了几个函数,其中一个函数的返回类型为DWORD.我不愿意windows.h只是为了获得这种类型的官方定义,因为该文件非常庞大,我的标题将用于许多其他方式不需要它的源模块.

当然,在实践中我知道这DWORD只是unsigned int,但我更愿意采用更卫生的方法来包含官方头文件(如果可能的话).

这个页面上它表示DWORD已定义windef.h,但不幸的是,只包含这个小文件直接导致编译错误 - 显然它希望被其他标题包含.(另外,我的文件是头文件的事实也意味着我不能只声明WIN32_LEAN_AND_MEAN,因为#includes我的文件的源文件可能需要保留未定义.)

有任何想法吗?我知道这不是世界末日 - 我可以继续#include <windows.h>- 但认为有人可能有更好的主意!

[编辑] 感谢您的回复.对于那些建议使用不同类型的人,让我解释为什么在这种情况下不可取:我在不同的源文件中设置了两个函数的不同平台特定版本,并要求CMake配置检测当前平台并选择要构建的那个.在Windows上,我的功能如下:

typedef DWORD TimePoint;
TimePoint GetTimeNow(void);
double TimeDifference(TimePoint start, TimePoint end);
Run Code Online (Sandbox Code Playgroud)

Windows版本GetTimeNow()只调用timeGetTime()具有返回类型的Windows API ,DWORD因此它必须具有相同的返回类型.(在其他平台上,TimePoint将有一个不同的类型,例如struct timeval在UNIXy平台上.)实际上,类型的值TimePoint是不透明的,你可以用它们做的唯一事情就是传递它们中的两个TimeDifference()来测量它们之间的经过时间(以秒为单位) .这实现了跨平台开发.不幸的是,它仍然意味着客户端代码必须知道具体类型TimePoint.

Ara*_*anu 5

包括 Windows.h 并使用预编译的头文件。顺便说一句,您可以先定义 WIN32_LEAN_AND_MEAN,然后再取消定义!


Tod*_*odd 5

我相信您曾经能够包含winbase.h,但现在似乎不再如此了。我所见过的所有源均推荐使用WIN32_LEAN_AND_MEAN选项的windows.h。正如您所指出的,后一种优化对您没有帮助。

你可以做这样的事情。

#ifndef _WINDEF_
typedef unsigned long DWORD;
#endif
Run Code Online (Sandbox Code Playgroud)

不干净,但是高效。此typedef不可能更改。


小智 5

Use this file: include <IntSafe.h>