如何在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);
}