【发布时间】:2010-03-18 21:03:16
【问题描述】:
我有一个自己的小头文件,它声明了几个函数,其中一个函数的返回类型为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);
GetTimeNow() 的 Windows 版本只调用了 Windows API timeGetTime(),它的返回类型为 DWORD,因此它必须具有相同的返回类型。 (在其他平台上,TimePoint 将具有不同的类型,例如,在 UNIXy 平台上为 struct timeval。)实际上,TimePoint 类型的值是不透明的,您唯一可以对它们做的事情就是将其中两个传递给TimeDifference() 以秒为单位测量它们之间的经过时间。这使得跨平台开发成为可能。不幸的是,这仍然意味着客户端代码必须知道TimePoint 的具体类型。
【问题讨论】:
-
为什么不使用 C 标准库,它在 Windows 上可用(参见 msdn.microsoft.com/en-us/library/abx4dbyh%28VS.80%29.aspx 和 msdn.microsoft.com/en-us/library/w4ddyt9h%28VS.80%29.aspx );如果您只需要 1 秒的分辨率,那么已经有一个名为
TimeDifference()的跨平台版本difftime() -
感谢 Cristoph,事实上这正是我所拥有的,但这是用于分析,我们有几个数据集在 1-10 秒范围内,所以我决定我想要更高的分辨率。