【问题标题】:Combining preprocessor macros and variables结合预处理器宏和变量
【发布时间】:2014-10-29 09:55:45
【问题描述】:

在我的 C++ 代码中,我必须在两种情况下执行某些代码:由于预处理器宏或布尔变量检查。例如:

bool done=false;
#ifdef _DEBUG
executeDebugCode();
done=true;
#endif

if (inputParam && !done)
    executeDebugCode();

有没有办法把上面的代码写得更优雅,不用重复两次executeDebugCode()函数调用?

编辑: executeDebugCode() 函数应该执行一次,如果满足两个条件之一。例如一个只能在 DEBUG 模式下执行的函数,可以通过预处理器宏或命令行参数设置。

【问题讨论】:

  • 你的问题有点不清楚。如果满足 either 条件还是仅在满足 both 条件时调用该函数?如果两者都满足,应该调用一次还是两次?
  • @Angew 大概缩短的“更优雅”的方式应该与上面的代码具有相同的行为。
  • 编辑得更清楚。抱歉,感谢答案和 cmets,通常会在稍后想到一些事情。

标签: c++ macros


【解决方案1】:

假设您只想执行此代码一次,如果这些条件中至少有一个为真:

    if ( inputParam
#ifdef DEBUG
        || true
#endif
       )
{
    executeDebugCode();
}

【讨论】:

  • 干净简单。与其他答案不同(都很好)没有声明或定义其他变量。
【解决方案2】:

我最常看到的这种形式,并且往往效果很好,是确实根据_DEBUG 进行精确检查,所以你会得到:

#ifdef _DEBUG
#define SHOULD_EXECUTE_DEBUG_CODE() 1
#else
#define SHOULD_EXECUTE_DEBUG_CODE() inputParam
#endif

if (SHOULD_EXECUTE_DEBUG_CODE())
  executeDebugCode();

请注意,如果inputParam 是一个局部变量(正如 Sambuca 在 cmets 中指出的那样),这个宏 SHOULD_EXECUTE_DEBUG_CODE 不能在其他函数中使用,并且为了可维护性,可能值得在末尾添加 #undef SHOULD_EXECUTE_DEBUG_CODE防止意外误用的功能。

【讨论】:

  • 我不知道我可以在函数中定义宏...很高兴知道
  • 我个人不喜欢的是使用宏插入(局部)变量的名称。考虑是否要在代码库的另一点使用此“预处理器开关”。
  • @Sambuca 如果inputParam 是一个局部变量(现在重新阅读,它看起来好像是),那么我同意,我会确保在最后#undef 它的功能。
【解决方案3】:

这样的事情怎么样:

bool debugEnabled = inputParam;
#ifdef _DEBUG
debugEnabled = true;
#endif

if (debugEnabled)
    executeDebugCode()

即。使用一个标志来控制代码行为,但允许以不同的方式设置该标志。

【讨论】:

    【解决方案4】:

    我的方法是这样的

    #ifdef _DEBUG
    #define SHOULD_EXECUTE 1
    #else
    #define SHOULD_EXECUTE 0
    #endif
    
    if (SHOULD_EXECUTE || inputParam) {
      executeDebugCode();
    }
    

    这样,您的 if 语句会立即显示您正在检查预处理器定义和另一个(布尔)条件。

    【讨论】:

      【解决方案5】:

      如果未启用 DEBUG,这不会在运行时产生任何开销。

      #ifdef _DEBUG
      #define MY_DEBUG true
      #else
      #define MY_DEBUG false
      #endif
      
      if ( inputParam || MY_DEBUG )
              executeDebugCode();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-13
        • 2011-04-26
        • 2015-04-15
        • 2017-04-04
        • 2015-07-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多