函数多态性取决于调试级别

时间:2019-01-29 08:51:00

标签: c debugging logging polymorphism

我想更改以下代码:

#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 :(得分:4)

  1. 定义用于将您的消息记录在某些<input type=text class="form-control" name="userName" [(ngModel)]="userModel.name"> 文件中的功能
  2. 定义您的log.c宏以调用正确的函数

log.c

callThePropperDebugFct

log.h

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.c

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.h

#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);
}

答案 1 :(得分:1)

#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);    
}