在我在Visual Studio 2013中编写的WDF驱动程序项目中,我有这个功能:
ZwWaitForSingleObject(hSemaphore, 0);
如果我省略了最后一个参数,那么会给出“函数调用中的参数太少”错误:
NTSTATUS ZwWaitForSingleObject(
_In_ HANDLE Handle,
_In_ BOOLEAN Alertable,
_In_opt_ PLARGE_INTEGER Timeout
);
问题是,我 必须 省略它,我不能只将其设置为NULL。因为,正如MSDN所说:
如果未指定Timeout参数,则等待不会 满意,直到对象达到信号状态。如果指定了显式的Timeout值为零,则为no 如果不能立即满足等待,将会发生等待。
所以,问题是:你有没有想过为什么Visual C ++强迫我在系统函数调用中键入可选参数? 如何避免?
答案 0 :(得分:4)
zero
与NULL
不同。这是一个C
API,没有“可选”参数。因此,传递NULL
意味着未指定引用文档中的两种情况
ZwWaitForSingleObject(handle, 0, NULL);
/* or ZwWaitForSingleObject(handle, 0, 0); which is the same */
VS
LARGE_INTEGER timeout;
timeout.QuadPart = 0L;
ZwWaitForSingleObject(handle, 0, &timeout);
答案 1 :(得分:1)
它是可选的,因为:如果您不想传递有效值,但 传递某些内容,则可选参数与C ++中的默认参数(即使此问题已标记为C
)。
Timeout
的变量类型是PLARGE_INTEGER
,它是指向LARGE_INTEGER的指针。创建LARGE_INTEGER并将其值设置为0并传递创建的LARGE_INTEGER将导致您指定的行为:
如果指定了显式的Timeout值为零,则不会等待 如果不能立即满足等待,就会发生。
但是,如果您只是将NULL
作为参数传递,则不会发生这种情况,它与a Timeout parameter is not specified
相同。