如何创建类似printf变量参数的函数

vin*_*dyz 19 c

我正在寻找为我的日志记录实现api like printf.它应该类似于调用printf.例如:

persistent_log(LogType0, "This is buffered writing %d", i);
Run Code Online (Sandbox Code Playgroud)

我查看了变量参数的内容,但似乎我需要知道那里的参数的数量和类型.所以我需要在这方面提供更多帮助.

Mic*_*ior 23

这是我发现的一个过去项目的摘录,对我来说效果很好.当然缺少一些初始化步骤.这里的关键是vfprintf处理打印各种参数细节的函数.

void _proxy_log(log_level_t level, const char *fmt, ...)
    __attribute__((format (printf, 2, 3)));

#define proxy_log(level, fmt, ...) _proxy_log(level, fmt"\n", ##__VA_ARGS__)

void _proxy_log(log_level_t level, const char *fmt, ...) {
    va_list arg;
    FILE *log_file = (level == LOG_ERROR) ? err_log : info_log;

    /* Check if the message should be logged */
    if (level > log_level)
        return;

    /* Write the error message */
    va_start(arg, fmt);
    vfprintf(log_file, fmt, arg);
    va_end(arg);

#ifdef DEBUG
    fflush(log_file);
    fsync(fileno(log_file));
#endif
}
Run Code Online (Sandbox Code Playgroud)

  • +1.没有太多人知道​​GCC的`__attribute __((format(...)))`工具来添加编译时类型检查. (2认同)
  • 为了帮助未来的旅行者:第一行,从'void _prox ...'到'2,3)));' 是所有函数声明并进入*.h.在声明函数之后,#define几乎可以去任何地方,并且实现是最后一点.也许这很明显,但我有一段时间感到困惑! (2认同)