传递可变参数时的奇怪行为

时间:2013-04-12 18:43:42

标签: c++ c variadic-functions

我知道,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

但为什么呢? 我的错是什么?

2 个答案:

答案 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实际上是否是正确的,而不是盲目崩溃。