簡體   English   中英

訪問沖突可變參數宏/函數C ++

[英]Access violation Variadic macro/function C++

我正在嘗試使用一些可變參數宏和函數為我的項目創建一個日志記錄系統,這些函數最終會在printf調用中結束。 但是,printf給我一個訪問沖突錯誤,我不確定為什么。

因此,讓我們從我的宏開始:

#ifdef _DEBUG
#define LogError(fmt, ...) Logger::Log(LOG_ERROR,fmt,__VA_ARGS__);
#define LogTrace(fmt, ...) Logger::Log(LOG_TRACE,fmt,__VA_ARGS__);
#define LogWarn(fmt, ...) Logger::Log(LOG_WARN,fmt,__VA_ARGS__);
#else
#define LogError(fmt, ...)   
#define LogTrace(fmt, ...)   
#define LogWarn(fmt, ...)  
#endif

如您所見,如果定義了_DEBUG,則宏將解析為對Logger :: Log的調用,並傳遞所有參數。

這是我的Logger :: Log函數:

void Logger::Log(LogType type, char* fmt, ...) {
     va_list args;
    va_start (args, fmt);
    std::string preFix = "";
    if (type==LOG_ERROR) preFix = "Error: ";
    else if (type==LOG_WARN) preFix = "Warn: ";
    else if (type==LOG_TRACE) preFix = "Trace: ";
    else preFix = "Unknown: ";

    printf(preFix.append(fmt).c_str(), args);
    va_end(args);
}

它會根據日志的類型為字符串添加前綴格式字符串,然后將可變數量的參數傳遞給printf,然后發生訪問沖突。

這是使用正在使程序崩潰的宏的實現。

LogTrace("Adding file to asset file. Asset name: %s, File: %s", fName.c_str(), assetName.c_str());

根據宏:這應該解決為:

Logger:Log(LOG_WARN,"Adding file to asset file. Asset name: %s, File: %s", <string1>, <string2>);

應該在Log函數中將其傳遞給printf。 使用斷點,我看到格式字符串已正確傳遞並加上了前綴,但是我似乎無法調試以查看可變數量的參數是否已正確傳遞給Log函數。

我是否已正確完成所有操作以將可變數量的參數傳遞給宏,函數和printf? 如果看起來我已正確完成所有操作,如何調試以查看變量參數如何傳遞? 任何幫助將非常感激。

我在發布問題后立即發現了問題... printf應該是vprintf才能使可變數量的參數正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM