するコードがある場合は、コードをlog_out()
書き直してください。ほとんどの場合、次のことができます。
static FILE *logfp = ...;
void log_out(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
vfprintf(logfp, fmt, args);
va_end(args);
}
追加のログ情報が必要な場合は、表示されるメッセージの前または後に出力できます。これにより、メモリ割り当てや不審なバッファサイズなどが節約されます。おそらくlogfp
、ゼロ(nullポインター)に初期化し、それがnullかどうかを確認して、必要に応じてログファイルを開く必要があります。ただし、既存のコードはlog_out()
とにかくそれを処理する必要があります。
このソリューションの利点は、それをのバリアントであるかのように簡単に呼び出せることprintf()
です。実際、これはのマイナーバリアントprintf()
です。
へのコードがない場合は、log_out()
上記のようなバリアントに置き換えることができるかどうか検討してください。同じ名前を使用できるかどうかは、アプリケーションフレームワークと現在のlog_out()
関数の最終的なソースによって異なります。別の必須機能と同じオブジェクトファイルにある場合は、新しい名前を使用する必要があります。それを正確に複製する方法を理解できない場合は、適切な量のメモリを割り当てる他の回答で提供されているようなバリアントを使用する必要があります。
void log_out_wrapper(const char *fmt, ...)
{
va_list args;
size_t len;
char *space;
va_start(args, fmt);
len = vsnprintf(0, 0, fmt, args);
va_end(args);
if ((space = malloc(len + 1)) != 0)
{
va_start(args, fmt);
vsnprintf(space, len+1, fmt, args);
va_end(args);
log_out(space);
free(space);
}
/* else - what to do if memory allocation fails? */
}
もちろん、log_out_wrapper()
代わりにを呼び出しますlog_out()
が、メモリの割り当てなどは一度だけ行われます。私は不要な1バイトだけスペースを過剰に割り当てる権利を留保します-によって返される長さにvsnprintf()
終端のnullが含まれるかどうかをダブルチェックしていません。