我编写了一个具有多个日志级别的日志记录机制。
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)
答案 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)
您可以使用宏来定义您要使用的包含文件,但是,为什么不使用包含文件并在那里使用宏?