我正在尝试使用一些可变参数宏和函数为我的项目创建一个日志记录系统,最终会在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? 如果看起来我已经完成了所有操作,那么如何进行调试以查看变量参数是如何传递的? 任何帮助将不胜感激。
答案 0 :(得分:2)
我在发布问题后立即发现问题... printf应该是vprintf,以使可变数量的参数正常工作。