组合预处理器宏和变量 在我的C++代码中,我必须在两个条件下执行某些代码:因为预处理器宏或布尔变量检查。例如: bool done=false; #ifdef _DEBUG executeDebugCode(); done=true; #endif if (inputParam && !done) executeDebugCode();
有没有一种方法可以更优雅地编写上述代码,而不必重复两次组合预处理器宏和变量 在我的C++代码中,我必须在两个条件下执行某些代码:因为预处理器宏或布尔变量检查。例如: bool done=false; #ifdef _DEBUG executeDebugCode(); done=true; #endif if (inputParam && !done) executeDebugCode();,c++,macros,C++,Macros,有没有一种方法可以更优雅地编写上述代码,而不必重复两次executeBugCode()函数调用 编辑: executeBugCode()函数应该执行一次,如果满足两个条件之一。例如,一个只应在调试模式下执行的函数,可以通过预处理器宏或命令行参数进行设置。类似以下内容如何: bool debugEnabled = inputParam; #ifdef _DEBUG debugEnabled = true; #endif if (debugEnabled) executeDebugCode
executeBugCode()
函数调用
编辑:
executeBugCode()
函数应该执行一次,如果满足两个条件之一。例如,一个只应在调试模式下执行的函数,可以通过预处理器宏或命令行参数进行设置。类似以下内容如何:
bool debugEnabled = inputParam;
#ifdef _DEBUG
debugEnabled = true;
#endif
if (debugEnabled)
executeDebugCode()
也就是说,使用一个标志来控制代码行为,但允许以不同的方式设置该标志。我看到的最常见的形式是,根据
\u 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在注释中指出的),则此宏应该执行\u调试\u code
不能用于其他函数,并且为了可维护性,可能值得在函数末尾添加#unde应该执行_DEBUG\u code
,以防止意外误用。假设您只想执行此代码一次,如果至少有一个条件为真:
if ( inputParam
#ifdef DEBUG
|| true
#endif
)
{
executeDebugCode();
}
如果未启用调试,则在运行时不会产生任何开销
#ifdef _DEBUG
#define MY_DEBUG true
#else
#define MY_DEBUG false
#endif
if ( inputParam || MY_DEBUG )
executeDebugCode();
我的方法是这样的
#ifdef _DEBUG
#define SHOULD_EXECUTE 1
#else
#define SHOULD_EXECUTE 0
#endif
if (SHOULD_EXECUTE || inputParam) {
executeDebugCode();
}
这样,您的if语句立即显示您正在检查预处理器定义和另一个(布尔)条件。您的问题有点不清楚。如果满足任一条件或仅当满足两个条件时才调用函数?如果两者都满足,应该调用一次还是两次?@Angew推测缩短的“更优雅”方式应该与上面的代码具有相同的行为。编辑为更清晰。很抱歉,由于回答和评论,我后来通常会想到一些事情。我不知道我可以在函数中定义宏……很高兴知道我个人不喜欢的是(局部)变量的名称是使用宏插入的。考虑是否要在代码库的另一个点使用此“预处理器开关”。@Sambuca如果
inputParam
是一个局部变量(现在重新读取,它看起来好像是),那么我同意,并且我会确保在函数结尾处#undef
它。干净简单。与其他答案不同(都很好),没有声明或定义额外的变量。