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

时间:2017-08-25 12:01:07

标签: c++ qt macros

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

 #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的文件中声明了外部,则它可以正常工作。我错了什么?

1 个答案:

答案 0 :(得分:2)

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

此外,Macros are evil。它们容易出错,不容易被忽略。请改用内联函数或constexp。编译器会将它优化为几乎相同的代码。