私の同僚はtinyxml2のソースコードをwchar(tinyxml2.2.0バージョン)に対応するように修正しています。コードは以下のとおりです。実際には、コードはliunxでのみ実行されるため、Windowsの部分は関係ありません。私の同僚が書いた以下のコード、 /**/ の間のコメントは私が考える正しい方法です。
void XMLPrinter::Print( const wchar_t* format, ... )
{
va_list va;
va_start( va, format );
wchar_t buf[MAX_PATH*30] ={0};
vswprintf( buf,MAX_PATH*30,format,va);
char * pText = NULL;
int iTextLen = wcstombs(NULL, buf , 0);
pText = new char[iTextLen + 1];
if (pText == NULL)
{
return ;
}
memset( ( void* )pText, 0, sizeof( char ) * ( iTextLen + 1 ) );
/*for a safe way ,should be sizeof(pText) instead of sizeof(buf)*/
wcstombs(pText, buf, sizeof(buf));
if ( _fp ) {
/*Here I think should be fwrite( pText , iTextLen , 1 , _fp ); */
fwrite( pText , iTextLen-1 , 1 , _fp );
}
else {
#if defined(_MSC_VER) && (_MSC_VER >= 1400 )
#if defined(WINCE)
int len = 512;
do {
len = len*2;
wchar_t* str = new wchar_t[len]();
len = _vsnprintf(str, len, format, va);
delete[] str;
}while (len < 0);
#else
int len = _vscwprintf( format, va );
#endif
#else
int len = vswprintf( 0, 0, format, va );
#endif
// Close out and re-start the va-args
va_end( va );
va_start( va, format );
TIXMLASSERT( _buffer.Size() > 0 && _buffer[_buffer.Size() - 1] == 0 );
/*Here should be _buffer.PushArr( len ) - sizeof(wchar_t);*/
wchar_t* p = _buffer.PushArr( len ) - 1; // back up over the null terminator.
#if defined(_MSC_VER) && (_MSC_VER >= 1400 )
#if defined(WINCE)
_vsnprintf( p, len+1, format, va );
#else
_vsnwprintf_s( p, len+1, _TRUNCATE, format, va );
#endif
#else
vswprintf( p, len+1, format, va );
#endif
}
delete[] pText;
va_end( va );
}
コードを見直して、同僚に言ったところ、うまく動作すると言われました。どうすればそれを証明できますか?上記のコードには他の問題がありますか?