一部のコンパイラはマクロで 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 が 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 )
ターミネーターを組み込むことを考えていましたが、既存のコードを変更する必要がないように、呼び出し元から隠したいと思います。