我知道,printf
还需要va_list
但是当我这样做时,printf
没有做我想做的事情printf
:
void Log(int loglevel, char* string, ...)
{
va_list args;
va_start(args, string);
switch (type)
{
case LOGLEVEL_FATAL:
printf("FATAL: ");
break;
case LOGLEVEL_ERROR:
printf("ERROR: ");
break;
case LOGLEVEL_WARNING:
printf("WARNING: ");
break;
case LOGLEVEL_INFO:
printf("INFO: ");
break;
}
printf(string, args);
va_end(args);
}
我现在打电话:
Log(LOGLEVEL_INFO, "testvariable = %f", 16.0);
输出是:
INFO: testvariable = 0.000000
但为什么呢? 我的错是什么?
答案 0 :(得分:3)
最后printf()
来电应该是vprintf()
(varargs为“v”)。
答案 1 :(得分:0)
在C ++ 11中,你可以这样做(在头文件中):
template<typename... Args>
void Log(int loglevel, char* string, Args&&... args)
{
switch (type)
{
case LOGLEVEL_FATAL:
printf("FATAL: ");
break;
case LOGLEVEL_ERROR:
printf("ERROR: ");
break;
case LOGLEVEL_WARNING:
printf("WARNING: ");
break;
case LOGLEVEL_INFO:
printf("INFO: ");
break;
}
printf(string, std::forward<Args>(args)...);
}
从理论上讲,这也可以解析string
并确定args
实际上是否是正确的,而不是盲目崩溃。