Подтвердить что ты не робот

Как создать функцию, такую ​​как аргумент переменной printf

Я искал реализацию api как printf для моего ведения журнала. Он должен быть похож на вызов printf. Например:

persistent_log(LogType0, "This is buffered writing %d", i);

Я просмотрел материал переменных аргументов, но мне кажется, что мне нужно знать количество и тип аргументов. поэтому мне нужна дополнительная помощь в этом отношении.

4b9b3361

Ответ 1

Вот выдержка из прошлого проекта, который, как мне показалось, хорошо работает для меня. Конечно, некоторые шаги инициализации отсутствуют. Ключевым здесь является функция 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
}