Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
组合预处理器宏和变量 在我的C++代码中,我必须在两个条件下执行某些代码:因为预处理器宏或布尔变量检查。例如: bool done=false; #ifdef _DEBUG executeDebugCode(); done=true; #endif if (inputParam && !done) executeDebugCode();_C++_Macros - Fatal编程技术网

组合预处理器宏和变量 在我的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
它。干净简单。与其他答案不同(都很好),没有声明或定义额外的变量。