在winbase.h
标题中,您可以找到以下行:
#define WAIT_OBJECT_0 ((STATUS_WAIT_0 ) + 0 )
{p> STATUS_WAIT_0
在winnt.h
标题中定义为:
#define STATUS_WAIT_0 ((DWORD)0x00000000L)
DWORD
是unsigned long
的类型定义。
我的问题是,为什么将0
添加到STATUS_WAIT_0
值?
答案 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_0
是NTSTATUS
(NTSTATUS 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_0
,STATUS_WAIT_0
和0
之间的值没有差异。
但是,与维护程序员沟通的内容存在差异。这一行:
#define WAIT_OBJECT_0 ((STATUS_WAIT_0 ) + 0 )
表示WAIT_OBJECT_0
与STATUS_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)
在此特定实例中,基值和第一个等待对象值设置相同,因为开发人员需要相同的整数值来表示它们。