我一直在阅读一些编译器支持带有宏的 va_list ,并且用户能够使用其他宏重载该功能以计算 va_list。
使用 Visual Studio,有没有办法确定 va_list 是否为空(又名 count==0)?基本上我想知道这种情况:
extern void Foo(const char* psz, ...);
void Test()
{
Foo("My String"); // No params were passed
}
我最初的想法是做这样的事情:
va_list vaStart;
va_list vaEnd;
va_start(vaStart, psz);
va_end(vaEnd);
if (vaStart == vaEnd) ...
问题是 va_end 仅将参数设置为空。
#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 )
我正在考虑可能合并一个终结器,但我希望它对调用者隐藏,以便不需要更改现有代码。