Jika Anda memiliki kode untuk log_out(), tulis ulang. Kemungkinan besar, Anda dapat melakukan:
static FILE *logfp = ...;
void log_out(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
vfprintf(logfp, fmt, args);
va_end(args);
}
Jika ada informasi logging tambahan yang diperlukan, yang dapat dicetak sebelum atau sesudah pesan ditampilkan. Ini menghemat alokasi memori dan ukuran buffer yang meragukan dan seterusnya dan seterusnya. Anda mungkin perlu menginisialisasi logfpke nol (penunjuk nol) dan memeriksa apakah itu nol dan membuka file log yang sesuai - tetapi kode yang ada log_out()harus menangani itu juga.
Keuntungan dari solusi ini adalah Anda dapat dengan mudah menyebutnya sebagai varian dari printf(); memang, ini adalah varian kecil pada printf().
Jika Anda tidak memiliki kodenya log_out(), pertimbangkan apakah Anda dapat menggantinya dengan varian seperti yang diuraikan di atas. Apakah Anda dapat menggunakan nama yang sama akan bergantung pada kerangka aplikasi Anda dan sumber utama dari log_out()fungsi saat ini . Jika ada di file objek yang sama dengan fungsi lain yang sangat diperlukan, Anda harus menggunakan nama baru. Jika Anda tidak dapat mengetahui cara mereplikasi dengan tepat, Anda harus menggunakan beberapa varian seperti yang diberikan dalam jawaban lain yang mengalokasikan jumlah memori yang sesuai.
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? */
}
Jelas, Anda sekarang memanggil log_out_wrapper()alih - alih log_out()- tetapi alokasi memori dan seterusnya dilakukan sekali. Saya berhak untuk mengalokasikan ruang secara berlebihan dengan satu byte yang tidak perlu - saya belum memeriksa ulang apakah panjang yang dikembalikan oleh vsnprintf()termasuk penghentian null atau tidak.