7

一部のコンパイラはマクロで 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 )

ターミネーターを組み込むことを考えていましたが、既存のコードを変更する必要がないように、呼び出し元から隠したいと思います。

4

3 に答える 3

7

...渡される引数の数や、それらがどのタイプであるかを知る方法はありません。printf可変個引数関数のパラメーターは、関数に何を期待するかを指示する他の方法(たとえば、スタイル形式の文字列)がある場合にのみ使用できます。それでも、引数を検証する方法はありません。

C ++ 11は、タイプセーフな可変個引数テンプレートを提供します。あなたのコンパイラがこれらをサポートしているかどうか、あるいはそれらがあなたの問題に適切であるかどうかはわかりません。

于 2012-07-25T15:42:52.940 に答える