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

时间:2010-03-18 21:03:16

标签: c windows header

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

当然,在实践中我知道DWORD只是unsigned int,但如果可能的话,我更倾向于使用更卫生的方法来包含官方头文件。

this page上,它表示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);

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

10 个答案:

答案 0 :(得分:4)

包含Windows.h并使用预编译的标头。顺便说一句,你可以定义WIN32_LEAN_AND_MEAN,然后再取消它!

答案 1 :(得分:3)

我相信你曾经能够包含winbase.h,但似乎不再是这种情况了。我见过的所有资源都推荐使用windows.h,并选择WIN32_LEAN_AND_MEAN。正如您所指出的,后一种优化对您没有帮助。

你可以这样做。

#ifndef _WINDEF_
typedef unsigned long DWORD;
#endif

不干净,但效率很高。这种typedef不太可能改变。

答案 2 :(得分:3)

Use this file: include <IntSafe.h>

答案 3 :(得分:2)

我要说自己定义一下。这样,它更加独立于平台(当然,我不知道代码的其余部分是否需要Windows)。如果您不想这样做,请使用预编译的标头。

答案 4 :(得分:2)

DWORD始终是32位无符号整数,因此使用DWORDunsigned longuint32_t并不重要。如果所有三种类型都引用32位unsigned int,则编译器将认为它们是等效的。

由于这是特定于平台的文件的一部分,因此我认为您不必担心可移植性。哎呀,深入了解标题以查找DWORD的本机类型,然后将该typedef放入标题中。 C编译器接受重复的typedef,只要它们具有相同的底层类型。

答案 5 :(得分:1)

为什么不改为定义返回int的函数?这是一种高度可移植的类型,完全将你的代码与邪恶的帝国 Microsoft分开。

答案 6 :(得分:1)

不要使用DWORD。我看到太多的Windows代码后来被移植到其他平台。当每个人都有自己的定义时,那些DWORD就成了一个真正的问题。我认为在接口中使用Windows特定类型没有任何合理的理由。

即使您的代码永远不会被移植到任何其他平台,我仍然认为代码应该使用本机类型或您自己的类型(例如,MyInt32,MyUInt64等),但不是来自windows.h。

答案 7 :(得分:1)

如果您担心当您的跨平台程序在Windows上运行时,它会加载太多Windows DLL,因为您的源代码有#include&lt; windows.h&gt;,我认为您太担心了。甚至记事本也必须加载已知宇宙的一半,并且有时会加载并执行它。

如果您担心当其他开发人员使用Windows时,您的跨平台.h文件会在编译环境中造成大量的命名空间污染,我认为您太担心了。 99.999%的Windows项目已经进行了#include&lt; windows.h&gt;在他们到你的.h文件之前。

答案 8 :(得分:1)

是否有&lt; wtypes.h&gt;你在哪里?因为在其中,我看到了:

#ifndef _DWORD_DEFINED
#define _DWORD_DEFINED
typedef unsigned long DWORD;

#endif // !_DWORD_DEFINED

这个文件位于“... \ VC98 \ INCLUDE”这里..这是用于VC6所以我认为它将在以后的版本中。

我跟OP一样,并通过包含所述标题来解决它。

答案 9 :(得分:0)

怎么样 - #include <minwindef.h>