C宏定义带条件的前缀宏

时间:2012-08-23 14:16:31

标签: c++ c macros

我编写了一个具有多个日志级别的日志记录机制。

LOG_FATAL(s)
LOG_ERROR(s)
LOG_WARN(s)
...

现在我希望能够激活或停用某些模块的日志记录。 我现在做什么:

#ifdef MOUDLE_LOG_ON
  MODULE_LOG_FATAL(s)  LOG_FATAL(s) 
  MODULE_LOG_ERROR(s)  LOG_ERROR(s)
  MODULE_LOG_WARN(s)   LOG_WARN(s)
  ...
#else
  MODULE_LOG_FATAL(s) 
  MODULE_LOG_ERROR(s)
  MODULE_LOG_WARN(s)
  ...
#endif

有没有办法将前缀放在宏中以便像这样使用它:

SETUPLOGGING(MODULE) 

3 个答案:

答案 0 :(得分:2)

宏无法定义新宏。在定义宏时,不可能从其他宏构建其名称,因此您不能使用包含定义所需内容的文件的常见工作。

答案 1 :(得分:2)

我想知道使用宏和内联函数是否可以解决您的问题:

void inline LOG_FATAL(const char *s)
{
    printf("%s\n", s);
}

#define SETUPLOGGING(x) \
    void inline x ## _LOG_FATAL(const char *s) { LOG_FATAL(s); }

SETUPLOGGING(MODULE)

int main()
{
    MODULE_LOG_FATAL("hello");
}

预处理后,产生:

void inline LOG_FATAL(const char *s)
{
 printf("%s\n", s);
}

void inline MODULE_LOG_FATAL(const char *s) { LOG_FATAL(s); }

int main()
{
 MODULE_LOG_FATAL("hello");
}

答案 2 :(得分:0)

您可以使用宏来定义您要使用的包含文件,但是,为什么不使用包含文件并在那里使用宏?