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

标签 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 多态性和函数指针有关,但我不知道该怎么做

最佳答案

  1. 定义将消息记录在一些 log.c 文件中的函数
  2. 定义您的 callThePropperDebugFct 宏以调用正确的函数

日志.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);
}

日志.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

但是您可以进一步使用一些可变参数宏和可变数量的参数函数:

日志.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);
}

日志.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

关于c - 取决于调试级别的函数多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54417056/

相关文章:

python - 本地函数无法识别记录器

debugging - Laravel 4 调试不起作用

visual-studio - Visual Studio : suppress debug output per DLL

java - 实现或替换公共(public)日志记录

c - 从内核空间写入文件

android - 在 Android 设备 (U8500) 上调试不可用,但代码可以在那里执行

Python:切换 "verbose"输出的最有效方法?

c++ - 如何在两个无限循环之间交替?

澄清 C 中指针的左值、右值行为

c# - 从 COM 调用托管 API