结合预处理器宏和变量

时间:2014-10-29 09:55:46

标签: c++ macros

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

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

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

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

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

5 个答案:

答案 0 :(得分:1)

我认为最适合这种形式的表格,往往效果很好,确实可以根据_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不能用于其他函数,并且为了可维护性,可能值得添加{{ 1}}在函数结束时防止意外误用。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

这样的事情怎么样:

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

if (debugEnabled)
    executeDebugCode()

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

答案 3 :(得分:0)

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

#ifdef _DEBUG
#define MY_DEBUG true
#else
#define MY_DEBUG false
#endif

if ( inputParam || MY_DEBUG )
        executeDebugCode();

答案 4 :(得分:0)

我的方法就是这样

#ifdef _DEBUG
#define SHOULD_EXECUTE 1
#else
#define SHOULD_EXECUTE 0
#endif

if (SHOULD_EXECUTE || inputParam) {
  executeDebugCode();
}

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