8

私のコードには、次のようなスニペットが含まれています。

    std::va_list ap;
    va_start(ap, msgfmt);
    snprintf_buf buf;
    const tchar * msg = buf.print_va_list(msgfmt, ap);
    va_end(ap);

これらは短く、va_start()互いにva_end()接近しているため、それほど問題にはなりません。2つの間の呼び出しからの例外が問題になる可能性があります(またはそうではありませんか?)。

簡単なテストでは、va_start()省略記号のない関数からの呼び出しは許可されていないことが示されています。許可された関数から呼び出さva_end()れた関数とは異なる関数から呼び出すかどうか。va_start()

va_start()基本的に、手動で呼び出してからインスタンスをstd::va_listRAII / SBRMガードインスタンスに渡す必要がある場合でも、これらの呼び出しにSBRM / RAIIイディオムを使用できるかどうか知りたいですか?

4

2 に答える 2

10

残念だけど違う。との仕様ではva_start、次のva_endことが必要です。

va_startおよびマクロの各呼び出しは、同じ関数内のマクロva_copyの対応する呼び出しと一致する必要があります。va_end

したがって、va_endクラス デストラクタではなく、可変個引数関数自体にある必要があります。

于 2012-08-27T12:46:43.480 に答える
0

可能な実装の 1 つは、std::va_list = char* と va_end() がそのポインターを null に設定しているだけであると想定しています。当然、関数の外で呼び出すことができます。しかし、他のプラットフォームでも同様に機能するかどうかはわかりません。

この関数をクラスでラップすることをお勧めします。

于 2012-08-27T12:46:29.763 に答える