组合预处理器宏和变量

Combining preprocessor macros and variables

本文关键字:变量 处理器 预处理 组合      更新时间:2023-10-16

在我的C++代码中,我必须在两个条件下执行某些代码:因为预处理器宏或布尔变量检查。例如:

bool done=false;
#ifdef _DEBUG
executeDebugCode();
done=true;
#endif
if (inputParam && !done)
    executeDebugCode();

有没有一种方法可以更优雅地编写上面的代码,而不重复executeDebugCode()函数调用两次?

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

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

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

我看到的最有效的形式是根据_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在评论中指出的那样),则该宏SHOULD_EXECUTE_DEBUG_CODE不能用于其他函数,并且为了可维护性,可能值得在函数末尾添加#undef SHOULD_EXECUTE_DEBUG_CODE,以防止意外误用。

这样的东西怎么样:

bool debugEnabled = inputParam;
#ifdef _DEBUG
debugEnabled = true;
#endif
if (debugEnabled)
    executeDebugCode()

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

我的方法类似于

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

通过这种方式,if语句立即显示您正在检查预处理器定义和另一个(布尔)条件。

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

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