यदि आपके पास कोड है 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
शून्य (नल पॉइंटर) को इनिशियलाइज़ करना होगा और यह जांचना होगा कि क्या यह अशक्त है और लॉग फ़ाइल को उपयुक्त के रूप में खोलें - लेकिन मौजूदा में कोड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()
- लेकिन मेमोरी आवंटन और इसी तरह एक बार किया जाता है। मैं एक अनावश्यक बाइट द्वारा अंतरिक्ष को ओवर-आवंटन करने का अधिकार सुरक्षित रखता हूं - मैंने डबल-चेक नहीं किया है कि क्या लंबाई वापस आ गई है vsnprintf()
जिसमें समाप्ति नल शामिल है या नहीं।