如何在C++中定义扩展到条件语句的宏?

How to define a macro that expands to a conditional statement in C++?

本文关键字:语句 条件 扩展到 定义 C++      更新时间:2023-10-16

我想创建一些上下文相关的宏。宏

#define LOG_WARNING(x) qWarning()().noquote().nospace() << x

工作正常,它位于文件Macros.h中。我想定义一个宏,当从单元测试例程调用时,它不会打印日志消息。所以,我修改了像

#define LOG_INFO(x) if(!UNIT_TESTING) qInfo().noquote().nospace() << x

由于以这种方式宏将取决于UNIT_TESTING,我在同一Macros.h中提供

extern bool UNIT_TESTING;   // Whether in course of unit testing

但是,编译器告诉

declaration does not declare anything [-fpermissive]
extern bool UNIT_TESTING; // Whether in course of unit testing
^

同时,如果在包含Macros.h的文件中声明了外部,则它可以正常工作。我错了什么吗?

下面介绍如何在源文件之间共享变量。尽管如此,我强烈建议不要这样做,而是实现一个函数(bool IS_UNIT_TESTING(( (或处理这个问题的类。 通过这种方式,您可以在不更改接口的情况下更改实现。

此外,宏是邪恶的。它们容易出错,无法轻松调试。改用内联函数或 constexp。编译器会将其优化为几乎相同的代码。