访问冲突c++的可变宏/函数

Access violation Variadic macro/function C++

本文关键字:函数 c++ 访问冲突      更新时间:2023-10-16

我试图为我的项目创建一个日志系统,使用一些可变的宏和函数,最终以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());

根据宏:this应该解析为:

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

应该在Log函数中传递给printf。使用断点,我看到格式字符串被正确地传递和前缀,但我似乎无法调试看到变量数量的参数被正确地传递给Log函数。

我做了一切正确传递变量量的参数到一个宏,一个函数和打印?如果看起来我做的一切都是正确的,那么我如何调试以查看变量参数是如何传递的呢?

我发现问题后张贴的权利…Printf应该是vprintf,这样变量数量的参数才能正常工作。