在winbase.h
头文件中,可以find以下行:
#define WAIT_OBJECT_0 ((STATUS_WAIT_0 ) + 0 )
STATUS_WAIT_0
在winnt.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_0
是STATUS_WAIT_0
是NTSTATUS
( 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_0
, STATUS_WAIT_0
和0
之间没有差别。
但是,与维护程序员交流的内容有所不同。 该行:
#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)
在这个特定的实例中,基本值和第一个等待对象值被设置为相同的,因为开发者想要相同的整数值来表示它们两者。