2013-06-03 55 views
1

我想爲我的項目使用一些可變參數宏和函數最終在printf調用中創建一個日誌記錄系統。然而,printf給我一個訪問衝突錯誤,我不知道爲什麼。訪問衝突Variadic宏/函數C++

所以讓我們開始與我的宏:

#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定義,宏將解析爲呼叫記錄::登錄,傳遞所有的參數。

這是我記錄儀::日誌功能:

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? 如果看起來我已經正確地做了所有事情,我該如何進行調試以查看變量參數是如何傳遞的? 任何幫助將不勝感激。

回答

2

在發佈問題後,我發現問題正確...... printf應該是vprintf,以便變量的參數能正常工作。