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++ 强制我在系统函数调用中键入可选参数吗?
如何避免?
zero
与 NULL
不同。这是一个C
API,没有"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
相同。
在我在 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++ 强制我在系统函数调用中键入可选参数吗? 如何避免?
zero
与 NULL
不同。这是一个C
API,没有"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
相同。