首页 > 解决方案 > 如何设置动态切换定义的宏?

问题描述

我试图让我的定义可以在运行时切换,所以我不能启用/禁用打印一些信息。

我有下一个文件:

在 config.c 中:

//define DEBUG   // <--------------- COMMENT THIS TO SWITCH PRINT/NOT PRINT

#define PRINTF(fmt, ...)    printf("TAG: " fmt "\n", ## __VA_ARGS__)

#ifdef  DEBUG
#define DPRINTF PRINTF
#else
#define DPRINTF(...)    do {} while (0)
#endif

int foo()
{
   ...
   if(error){
      PRINTF("error happens, code %d", code);
   }
   else{
      DPRINF("all good, all parameters: [%d][%d]", par1, par2);
   }
}

(简短说明:如果DEBUG定义了宏D PRINTF 将打印一些信息,否则什么也不做)

我想要的是能够以某种方式从 main.c 动态切换它,而不是注释/取消注释并重新编译程序。

所以我的想法是在 config.h 中设置

extern  uint8_t dbg_status;
#define DGB_ON  (1)
#define DGB_OFF (0)
#define ENABLE_DBG (dbg_status? (DGB_ON) : (DGB_OFF))

在 main.c 中做这样的事情:

uint8_t dbg_status;

int main(int argc, char** argv)
{
    // enable debug if run with next argument:
    // program.exe -DEBUG 
    if (!strcmp(argv[1], "-DEBUG"))
    {
        // enable debug prints
        dbg_status= 1;
    }
    else
    {
        // disable debug prints
        dbg_status= 0;
    }
    ...
}

但我现在坚持下去,我不知道下一步该怎么做......

在 config.c 中添加一些额外的定义?

#if (ENABLE_DEBUG)
#define DEBUG
#endif

我觉得我走在正确的道路上,但不知道下一步该往哪里走。

UPD: 来自这里的原始想法: Changing a macro at runtime in C

但我坚持意识到......

标签: c

解决方案


你可以使用这样的东西:

int debugflag = 0;
void DPRINTF(char *format, ...) {
        if (!debugflag)
                return;
        va_list ap;
        va_start(ap, format);
        vfprintf(stderr, format, ap);
        va_end(ap);
}

现在,您可以使用全局变量动态选择debugflag是否需要调试输出。

对于宏,这是不可能直接实现的,因为它们是在编译时评估的,并且不能在运行时直接受到影响。


推荐阅读