Kodunuz varsa log_out(), yeniden yazın. Büyük olasılıkla şunları yapabilirsiniz:
static FILE *logfp = ...;
void log_out(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
vfprintf(logfp, fmt, args);
va_end(args);
}
Ekstra günlük bilgisi gerekiyorsa, bu gösterilen mesajdan önce veya sonra yazdırılabilir. Bu, bellek tahsisini ve şüpheli arabellek boyutlarını vb. Azaltır. Muhtemelen logfpsıfıra (boş gösterici) başlatmanız ve boş olup olmadığını kontrol etmeniz ve günlük dosyasını uygun şekilde açmanız gerekir - ancak mevcut koddaki kodlog_out() gerekir bununla ilgileniyor olmalıdır.
Bu çözümün avantajı, sanki bir varyantıymış gibi adlandırabilmenizdir printf(); gerçekten de küçük bir değişkendir printf().
Kodunuz log_out()yoksa, onu yukarıda belirtilen gibi bir varyantla değiştirip değiştiremeyeceğinizi düşünün. Aynı adı kullanıp kullanamayacağınız, uygulama çerçevenize ve mevcut log_out()işlevin nihai kaynağına bağlı olacaktır . Başka bir vazgeçilmez işlevle aynı nesne dosyasındaysa, yeni bir ad kullanmanız gerekir. Tam olarak nasıl kopyalayacağınızı çözemezseniz, uygun miktarda bellek ayıran diğer yanıtlarda verilenler gibi bazı değişkenler kullanmanız gerekecektir.
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? */
}
Açıkçası, şimdi log_out_wrapper()yerine çağırıyorsunuz log_out()- ancak bellek ayırma ve benzeri işlemler bir kez yapılır. Gereksiz bir bayt fazla alan tahsis etme hakkını saklı tutuyorum - döndürülen uzunluğun vsnprintf()sonlandırıcı boş değeri içerip içermediğini iki kez kontrol etmedim .