полиморфизмы функций в зависимости от уровня отладки - PullRequest
0 голосов
/ 29 января 2019

Я хотел бы изменить приведенный ниже код:

#ifdef CONSOLE_VERBOSE_DEBUG
    printf("this debug error message is printed to the console");
#elseif FILE_VERBOSE_DEBUG
    FILE *log = fopen(...);
    ...
    fprintf();
    fclose();
#else 
    ((void) 0) // no debugging

на что-то вроде

callThePropperDebugFct("message");

и указать этот единственный вызов на функции, объявленные в правильно включенных заголовочных файлах, в зависимости от того, какой DEBUGуровень определен

Я знаю, что это связано с полиморфизмами c и указателями на функции, но я не могу понять, как это сделать

Ответы [ 2 ]

0 голосов
/ 29 января 2019
#if DEBUG_LEVEL 
#ifndef LOG_OUTPUT
#define LOG_OUTPUT stdio 
#endif
log_function(DEBUG_LEVEL, LOG_OUTPUT, const char *fmt, ...);
#endif

#ifdef __GNUC__
#define ATTR __attribute__((format (printf, 3, 4)));
#else
/* ..  */
#endif

void ATTR log_function(int DEBUG_LEVEL, FILE *LOG_OUTPUT, const char *fmt, ...)
{
    va_list args;
    /* some code */

    vfprintf(LOG_OUTPUT, fmt, args);    
}
0 голосов
/ 29 января 2019
  1. Определение функций для записи вашего сообщения в некоторый log.c файл
  2. Определение макроса callThePropperDebugFct для вызова нужной функции

log.c

void log_to_console(const char message)
{
    printf("%s", message);   
}

void log_to_file(const char *name, const char *message)
{
    FILE *f = fopen(name, "a");
    if (!f) return;

    fprintf(f, message);    

    fclose(f);
}

log.h

void log_to_console(const char message);
void log_to_file(const char *name, const char *message);

#ifdef CONSOLE_VERBOSE_DEBUG
#define callThePropperDebugFct(message) log_to_console(message); 
#elseif FILE_VERBOSE_DEBUG
#define callThePropperDebugFct(message) log_to_file(LOG_FILE, message)
#else
#define callThePropperDebugFct(message)
#endif

Но вы можете пойти дальше с некоторыми переменными макросами и переменным числом аргументов функций:

log.c

#include <stdarg.h>
#include <stdio.h>

void log_to_console(const char *fmt, ...)
{
    va_list args;
    va_start(args, fmt);
    //vsnprintf(buffer, sizeof buffe, fmt, args);
    vprintf(fmt, args);
    va_end(args);
}

void log_to_file(const char *name, const char *fmt, ...)
{
    FILE *f = fopen(name, "a");
    if (!f) return;

    va_list args;
    va_start(args, fmt);
    vfprintf(f, fmt, args);
    va_end(args);

    fclose(f);
}

log.h

void log_to_console(const char *fmt, ...);
void log_to_file(const char *name, const char *fmt, ...);

#ifdef CONSOLE_VERBOSE_DEBUG
#define callThePropperDebugFct(...) log_to_console("s", __VA_ARGS__)
#elseif FILE_VERBOSE_DEBUG
#define callThePropperDebugFct(...) log_to_file(LOG_FILE, "%s", __VA_ARGS__)
#else
#define callThePropperDebugFct(...)
#endif
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...