我有一个自己的小头文件,它声明了几个函数,其中一个函数的返回类型为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
的具体类型。
答案 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位无符号整数,因此使用DWORD
或unsigned long
或uint32_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>
?