MSVC:省略可选参数时“函数调用中的参数太少”

时间:2015-07-29 13:40:35

标签: c visual-studio-2013 optional-parameters

在我在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 ++强迫我在系统函数调用中键入可选参数? 如何避免?

2 个答案:

答案 0 :(得分:4)

zeroNULL不同。这是一个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相同。