หากคุณมีรหัสให้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);
}
}
เห็นได้ชัดว่าตอนนี้คุณเรียกใช้log_out_wrapper()
แทนlog_out()
- แต่การจัดสรรหน่วยความจำและอื่น ๆ จะทำครั้งเดียว ฉันขอสงวนสิทธิ์ในการจัดสรรพื้นที่มากเกินไปโดยหนึ่งไบต์ที่ไม่จำเป็น - ฉันไม่ได้ตรวจสอบอีกครั้งว่าความยาวที่ส่งคืนโดยvsnprintf()
รวมค่าว่างที่สิ้นสุดหรือไม่