【问题标题】:Getting an if-statement to also check for a defined macro获取一个 if 语句来检查定义的宏
【发布时间】:2020-01-14 04:33:14
【问题描述】:

我有一个if-else if 应该检查一个标志以及是否定义了一个宏。我提出了两种解决方案,但不确定使用哪一种。

  • 是否会在执行时间上有所不同(或者编译器优化会消除这一点)?
  • 如果未定义标志(即由于在示例代码上方或下方编写的行),第一个解决方案是否会导致 else 出现错误?

另外:

  • 是否有任何普遍遵循的最佳实践可以适用于这种情况?

1

#ifdef FLAG_A
    if(flagB)
    {
        ...
    }
    else
#endif
    {
        ...
    }

2

#ifdef FLAG_A
    bool flagA = true;
#else
    bool flagA = false;
#endif

    if(flagA && flagB)
    {
        ...
    }
    else
    {
        ...
    }

【问题讨论】:

  • 1 的一个问题是,如果您需要else if() 和/或额外的#ifdef FLAG_B,会发生什么?

标签: c++ if-statement c-preprocessor code-readability


【解决方案1】:

如果 flagA 变量在本地范围内(并且在该范围内保持未修改),则两者将编译为完全相同(对于大多数编译器,在非调试版本中)。但是,如果 flagA 是全局变量,则需要将其声明为 'constexpr' (在另一种情况下这可能是个好主意!)

证明:https://godbolt.org/z/r9nra5

在最佳实践方面,我相信每个人都会有自己的偏好,但我更喜欢版本 1。唯一的原因是立即清楚 #ifdef / #endif 块中的代码是有条件编译的.在查看案例 2 时,它可能不会立即显现出来。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 2019-01-12
    • 2012-01-26
    • 2016-02-04
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    相关资源
    最近更新 更多