トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

フォーマット文字列を展開するバッファの確保

コンパイル環境によって分かれるもよう。

GNU拡張の場合

vasprintfでバッファの確保とコピーを同時に行う。

void MyPrintf( const char* format, ... )
{
    va_list argptr;
    va_start(argptr, format);

    char* buf_ = NULL;
    vasprintf( &buf_, format, argptr );

    MyPrintString( buf_ );

    free( buf_ );
    va_end(argptr);
}

VC拡張の場合

_vscprintfで展開後の文字列長を取得し、それに+1した長さのバッファを用意する。

void MyPrintf( const char* format, ... )
{
    va_list argptr;
    va_start(argptr, format);

    int length = _vscprintf(format, argptr);
    char* buf_ = new char [length + 1];
    vsprintf( buf_, format, argptr );

    MyPrintString( buf_ );

    delete[] buf_;
    va_end(argptr);
}

VC拡張はメモリ確保を外部化できるので、より柔軟な印象。