如何在C中定义一个接受格式化输入字符串的函数?

我构建了一个自定义日志记录函数,它接收“日志级别”和字符串。用户将指定与消息关联的日志级别(即错误、警告、跟踪等)。日志功能只会根据当前配置的日志级别将消息打印到控制台。

int global_log_level = INFO;

void logger(int msg_log_level, char * msg)
{
    if(msg_log_level >= global_log_level )
    {
        printf("Log Level = %u: %s", msg_log_level, msg);
    }
}

理想情况下,我想将格式化的字符串提供给这个函数。

logger(LOG_LEVEL_ERROR, "Error of %u occurredn", error_code);

但是,通过添加此“包装”逻辑,我无法输入格式化的消息。相反,我必须将消息写入一个临时字符串,然后将其输入到函数中。

char temp[512];
sprintf("Error of %u occurredn", error_code);
logger(LOG_LEVEL_ERROR, temp);

有没有办法实现记录器功能,这样我就不需要让用户自己创建一个临时字符串?

回答

这是问题15.5上Ç常见问题列表。

您想要vprintf,它可以让您编写自己的printf类似函数logger,但是您可以在其中传递实际的格式字符串和参数vprintf来完成这项工作。诀窍是您需要构造一个特殊va_arg类型来“指向”可变长度参数列表。它看起来像这样:

#include <stdarg.h>

int global_log_level = INFO;

void logger(int msg_log_level, char * msg, ...)
{
    va_list argp;
    va_start(argp, msg);

    if(msg_log_level >= global_log_level )
    {
       printf("Log Level = %u: ", msg_log_level);
       vprintf(msg, argp);
    }

    va_end(argp);
}


以上是如何在C中定义一个接受格式化输入字符串的函数?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>