【问题标题】:Access violation Variadic macro/function C++访问冲突 可变参数宏/函数 C++
【发布时间】:2013-06-03 23:40:15
【问题描述】:

我正在尝试使用一些最终以 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? 如果看起来我已经正确完成了所有操作,我该如何调试以查看变量参数是如何传递的? 任何帮助将不胜感激。

【问题讨论】:

    标签: c++ macros variadic-functions


    【解决方案1】:

    我在发布问题后立即发现了问题... printf 应该是 vprintf 以使可变数量的参数正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多