หากคุณมีรหัสให้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()รวมค่าว่างที่สิ้นสุดหรือไม่