【问题标题】:How to define a macro that expands to a conditional statement in C++?如何在 C++ 中定义扩展为条件语句的宏?
【发布时间】:2017-08-25 12:01:06
【问题描述】:

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

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

【问题讨论】:

  • 您在extern "C" 块中吗? UNIT_TESTING 是宏吗?
  • 这当然不是条件宏。它是一个扩展为条件语句的无条件宏。
  • 您确定要使用宏吗?日志记录类更加防弹,您可以为该类提供何时打印和何时不打印的属性。
  • @NathanOliver 好吧,我更喜欢编译时解决方案,
  • @Jarod42 UNIT_TESTING 是一个简单的布尔值,而不是 extern "C"

标签: c++ qt macros


【解决方案1】:

Here 是如何跨源文件共享变量。尽管如此,我强烈建议不要这样做,而是实现一个函数 (bool IS_UNIT_TESTING() ) 或处理这个问题的类。这样你就可以在不改变接口的情况下改变实现。

此外,Macros are evil。它们容易出错,不能轻易调试。请改用内联函数或 constexp。编译器会将其优化为几乎完全相同的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 2017-04-18
    • 2011-03-03
    • 2020-09-18
    • 1970-01-01
    • 2014-07-16
    • 2019-09-10
    相关资源
    最近更新 更多