gcc でもコンパイルできるようにコードを変換しようとしています (現在、MSVC でのみコンパイルされます)。
私が立ち往生しているコードは、フォーマット文字列とゼロ個以上の引数 ( const char *format, ...
) を入力として受け入れる疑似フォーマット関数にあります。次に、いくつかの引数を消費するプレースホルダーのいくつかを処理し、残りを動的に生成された新しい va_list と共に渡します。vsprintf
これは、新しいを生成するための実際のコードですva_list
:
char *new_args = (char *) malloc(sum);
char *n = new_args;
for(int i = 0; i < nArgs; i++)
{
int j = order[i];
int len = _getlen(types[j]);
memcpy(n, args + cumulOffsets[j], len);
n += len;
}
vsprintf(buffer, sFormat.c_str(), new_args);
私の弁護では、私はこのコードを書きませんでしたし、書きませんでした。実際、これまでの人生で見た中で最もハックなものの 1 つだと思います。
ただし、この関数は非常に複雑で、非常に古く、非常に重要です。また、何年も変更されていないため (今を除いて)、最初から書き直したいと思っていますが、それにかかる時間とバグが発生することを正当化することはできません。
だから、私はGCCでこれと同じことをする方法が必要です..しかし、そうでva_list
はないchar *
ので、私は得ています:
エラー: ISO C++ は、配列型 '__va_list_tag [1]' へのキャストを禁止しています