我正在写一个日志类,为了有用,我需要一个类似于printf:的可变函数
void Logger::log(std::string message, int level, const char* fmt...) {
int bufferSize = 1000;
char buffer[bufferSize];
int cx = snprintf(buffer, bufferSize, message.c_str(), fmt);
if (cx >= 0 && cx < bufferSize) {
Logger::log(buffer, level);
} else {
Logger::error("Logger Error with variadic arguments");
}
}
该功能有两个问题:
首先,显然我不能简单地将fmt
传递给snprintf()
,但我不知道如何实现这一点?
其次,当我的程序调用Logger:log((时,第一个变参数是整数,它在编译时抛出一个错误invalid conversion from ‘int’ to ‘const char*’ [-fpermissive]
:
这是有问题的调用,位置x和位置y都是int:
Logger::log(" %d/%d", Logger::LVL_DEBUG, dirty->pos.x, dirty->pos.y);
相比之下,这项工作:Logger::log(" %s", Logger::LVL_DEBUG, "hello World");
感谢上面的所有人,我通过调整参数并使用vsprintf((解决了这个问题
void Logger::log(int level, const char* fmt...) {
va_list args;
va_start(args, fmt);
int bufferSize = 1000;
char buffer[bufferSize];
int cx = vsprintf(buffer, fmt, args);
va_end(args);
if (cx >= 0 && cx < bufferSize) {
Logger::log(buffer, level);
} else {
Logger::error("Logger error while using dynamic parameters");
}
}