如何确定va_list是否为空

Bab*_*ish 7 c++ variadic-functions visual-studio-2010 visual-c++

我一直在阅读一些编译器支持带宏的va_list,并且用户能够使用其他宏重载功能以计算va_list.

使用visual studio,有没有办法确定va_list是否为空(aka count == 0)?基本上我想知道这个条件:

extern void Foo(const char* psz, ...);
void Test()
{
  Foo("My String"); // No params were passed
}
Run Code Online (Sandbox Code Playgroud)

我最初的想法是做这样的事情:

va_list vaStart;
va_list vaEnd;
va_start(vaStart, psz);
va_end(vaEnd);
if (vaStart == vaEnd) ...
Run Code Online (Sandbox Code Playgroud)

问题是va_end只将param设置为null.

#define _crt_va_start(ap,v)  ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )
#define _crt_va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define _crt_va_end(ap)      ( ap = (va_list)0 )
Run Code Online (Sandbox Code Playgroud)

我在想可能包含一个终结符,但是我希望它能够从调用者中隐藏,以便不需要更改现有代码.

Mik*_*our 5

没有办法告诉我们传递了多少参数...,也没有说明它们是什么类型.变量函数参数只能用于其他方式(例如,一种printf格式字符串)来告诉函数期望什么; 即便如此,也无法验证论点.

C++ 11提供了类型安全的可变参数模板.我不知道您的编译器是否支持这些,或者它们是否适合您的问题.