为什么WAIT_OBJECT_0定义为((STATUS_WAIT_0)+ 0)

时间:2013-10-18 07:52:27

标签: c++ windows winapi

winbase.h标题中,您可以找到以下行:

#define WAIT_OBJECT_0       ((STATUS_WAIT_0 ) + 0 )
{p> STATUS_WAIT_0winnt.h标题中定义为:

#define STATUS_WAIT_0       ((DWORD)0x00000000L)

DWORDunsigned long的类型定义。

我的问题是,为什么将0添加到STATUS_WAIT_0值?

4 个答案:

答案 0 :(得分:9)

有两个可能的原因。首先是可读性。如果 有一系列#define s:

#define WAIT_OBJECT_0 ((STATUS_WAIT_0) + 0)
#define WAIT_OBJECT_1 ((STATUS_WAIT_0) + 1)
//  ...

在这种情况下,指定((STATUS_WAIT_0) + 0)是有意义的 出于正交性的原因:你正在定义一系列 基于STATUS_WAIT_0的值,这只是偶然的 这个碰巧被0抵消,而不是其他一些值。

第二个可能的原因涉及整体推广。该 作者希望WAIT_OBJECT_0拥有推广类型 STATUS_WAIT_0 STATUS_WAIT_0,与{{1}}的类型无关。该 另外确保整体推广。

答案 1 :(得分:5)

其他答案未解决的一个重要问题是,STATUS_WAIT_0NTSTATUSNTSTATUS Values)的可能值之一。 NTSTATUS主要用于编写设备驱动程序。

当您在 thing 上执行WaitFor...时,执行可能会下载到内核中,并且取决于您正在等待设备驱动程序的结果是NTSTATUS类型(1)

因此,在用户模式下等待的结果基于Wait in kernel模式的结果是有道理的,因此:

#define WAIT_OBJECT_0 ((STATUS_WAIT_0 ) + 0 )

现在,至于为什么我们添加零...正如James Kanze所说,它使得在定义WAIT_OBJECT_1的情况下更具可读性。一致性是可维护性的重要组成部分。

至于为什么STATUS_WAIT_0被强制转换为DWORD ...这是因为0x0L作为常量的值会因编译器而异,因此强制转换可确保您确切知道大类型是。


(1)不是设备驱动程序的作者,我不能假设这种说法在100%的时间都是正确的,但它是有道理的:)

答案 2 :(得分:3)

正如您已经提到的,就编译器而言,WAIT_OBJECT_0STATUS_WAIT_00之间的值没有差异。

但是,与维护程序员沟通的内容存在差异。这一行:

#define WAIT_OBJECT_0       ((STATUS_WAIT_0 ) + 0 )

表示WAIT_OBJECT_0STATUS_WAIT_0相同,但不一定如此。该行表示WAIT_OBJECT_0所代表的值可能会发生变化而不会产生任何后果。但是,如果它写成:

#define WAIT_OBJECT_0       STATUS_WAIT_0

这表明它们是等价的并且(可能)以某种方式联系在一起。

或者,它可能只是编码标准。

答案 3 :(得分:2)

这只是一种定义宏的方式,它是一个系列,其中系列成员依赖于基值。

#define NONE 0
#define UNITY  (NONE + 1)
#define COUPLE (NONE + 2)
#define TRIPLE (NONE + 3)

稍后,在维护期间,如果确定基值应该为60,那么将NONE更改为60将改变所有这些,因为它们是在基本宏上定义的。另一种方式是

#define NONE 0
#define UNO  (NONE + 1)
#define DUO  (UNO + 1)
#define TRIO (DUO + 1)

在此特定实例中,基值和第一个等待对象值设置相同,因为开发人员需要相同的整数值来表示它们。