0

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

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) 
4

3 回答 3

2

宏不能定义新的宏。并且在定义宏时,不可能从其他宏构建它的名称,因此您不能使用包含定义您想要的文件的常见解决方法。

于 2012-08-23T14:20:26.073 回答
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");
}
于 2012-08-23T14:28:17.477 回答
0

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

于 2012-08-23T14:29:58.837 回答