void WriteLog(wchar_t *szLog, ...) {
va_list arg_ptr;
va_start(arg_ptr, szLog);
fwprintf(fp, szLog, arg_ptr); // 錯誤:fwprintf 期望可變參數,非 va_list
fwprintf(fp, L"\n\n\n");
va_end(arg_ptr);
}
#include
#include
#include
void WriteLog(FILE *fp, const wchar_t *fmt, ...) {
va_list args;
va_start(args, fmt);
vfwprintf(fp, fmt, args); // vfwprintf 接受 va_list
fwprintf(fp, L"\n\n\n");
va_end(args);
}
// 調用
int main() {
FILE *fp = fopen("log.txt", "a, ccs=UTF-8");
WriteLog(fp, L"Hello %s, number %d", L"World", 42);
fclose(fp);
return 0;
}
| 函數 | 參數 | 用途 |
|---|---|---|
fwprintf | (FILE*, fmt, ...) | 直接可變參數 |
vfwprintf | (FILE*, fmt, va_list) | 接受已封裝的 va_list |
vsnwprintf | (wchar_t*, size_t, fmt, va_list) | 寫入緩衝區,防溢出 |
typedef enum { LOG_DEBUG, LOG_INFO, LOG_WARN, LOG_ERROR } LogLevel;
void LogWrite(LogLevel level, const wchar_t *fmt, ...) {
static const wchar_t *prefix[] = {L"[DBG]", L"[INF]", L"[WRN]", L"[ERR]"};
FILE *fp = fopen("app.log", "a, ccs=UTF-8");
if (!fp) return;
SYSTEMTIME st; GetLocalTime(&st);
fwprintf(fp, L"%04d-%02d-%02d %02d:%02d:%02d %s ",
st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, prefix[level]);
va_list args;
va_start(args, fmt);
vfwprintf(fp, fmt, args);
va_end(args);
fwprintf(fp, L"\n");
fclose(fp);
}
**可變參數轉發必須用 v*printf 族函數**。
va_list是不可複製的一次性對象,**只能傳給 vfwprintf/vsnwprintf 等**,不能傳給 fwprintf/printf。記住:va_start → vfwprintf → va_end三部曲。