0

我想,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

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

4

2 回答 2

3

最后的printf()调用应该是vprintf()(“v”表示可变参数)。

于 2013-04-12T18:45:19.010 回答
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实际上是正确的,而不是盲目地崩溃。

于 2013-04-12T19:17:31.670 回答