MSVC:"too few arguments in function call" 省略可选参数时

MSVC: "too few arguments in function call" when omitting optional parameter

在我在 Visual Studio 2013 年编写的 WDF 驱动程序项目中,我得到了这个函数:

ZwWaitForSingleObject(hSemaphore, 0);

如果我省略最后一个可选参数,则会出现 "too few arguments in function call" 错误:

    NTSTATUS ZwWaitForSingleObject(
  _In_     HANDLE         Handle,
  _In_     BOOLEAN        Alertable,
  _In_opt_ PLARGE_INTEGER Timeout
);

问题是,我不得不省略它,我不能直接将它设置为NULL。因为,正如 MSDN 所说:

If a Timeout parameter is not specified, then the wait will not be satisfied until the object attains a state of Signaled. If an explicit Timeout value of zero is specified, then no wait will occur if the wait cannot be satisfied immediately.

所以,问题是:您知道为什么 Visual C++ 强制我在系统函数调用中键入可选参数吗? 如何避免?

zeroNULL 不同。这是一个CAPI,没有"optional"参数。因此传递 NULL 意味着 未指定 您引用的文档中的两种情况是

ZwWaitForSingleObject(handle, 0, NULL);
/* or ZwWaitForSingleObject(handle, 0, 0); which is the same */

LARGE_INTEGER timeout;
timeout.QuadPart = 0L;
ZwWaitForSingleObject(handle, 0, &timeout);

它是可选的,如下所示:如果您不想,则不必传递有效值,但您必须传递一些东西,可选参数不需要与 C++ 中的默认参数一样工作(即使这个问题已经被标记为 C)。

Timeout的变量类型是PLARGE_INTEGER,是指向LARGE_INTEGER的指针。创建 LARGE_INTEGER 并将其值设置为 0 并传递创建的 LARGE_INTEGER 将导致您指定的行为:

If an explicit Timeout value of zero is specified, then no wait will occur if the wait cannot be satisfied immediately.

然而,当你简单地将 NULL 作为参数传递时,这不会发生,它与 a Timeout parameter is not specified 相同。