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

winbase.h头文件中,可以find以下行:

 #define WAIT_OBJECT_0 ((STATUS_WAIT_0 ) + 0 ) 

STATUS_WAIT_0winnt.h头文件中定义如下:

 #define STATUS_WAIT_0 ((DWORD)0x00000000L) 

DWORD是键入unsigned long

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

有两个可能的原因。 首先是可读性。 如果有一系列#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定义了一系列值,而且偶然发生了这个错误,而不是一些其他价值。

第二个可能的原因涉及整体推广。 作者希望WAIT_OBJECT_0的升级类型为STATUS_WAIT_0 ,而不管STATUS_WAIT_0的类型STATUS_WAIT_0 。 此外,确保整体推广。

其他答案没有解决的一个STATUS_WAIT_0STATUS_WAIT_0NTSTATUS ( NTSTATUS值 )的可能值之一。 NTSTATUS主要用于编写设备驱动程序。

当你对一个事物执行一个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%的时间内是真实的,但它是有意义的:)

正如你已经提到的那样,就编译器而言, WAIT_OBJECT_0STATUS_WAIT_00之间没有差别。

但是,与维护程序员交流的内容有所不同。 该行:

 #define WAIT_OBJECT_0 ((STATUS_WAIT_0 ) + 0 ) 

WAIT_OBJECT_0是一样的,但不一定是。 该行表示由WAIT_OBJECT_0表示的值可以改变,而不会有任何结果。 但是,如果它被写为:

 #define WAIT_OBJECT_0 STATUS_WAIT_0 

这表明它们是等价的,并且可能以某种方式连接在一起。

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

这只是一种定义宏是一个家庭的风格,家庭成员依赖于基础价值。

 #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) 

在这个特定的实例中,基本值和第一个等待对象值被设置为相同的,因为开发者想要相同的整数值来表示它们两者。