2014-10-29 135 views
2

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

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

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

是否有写上面的代码以更优雅的方式,但不重复executeDebugCode()函数调用两次的方法吗?

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

+0

你的问题有点不清楚。如果满足*条件或只有满足*两者,才能调用功能?如果两者都符合,是否应该被称为一次或两次? – Angew 2014-10-29 10:04:47

+0

@Angew假设缩短的“更优雅”的方式应该与上面的代码具有相同的行为。 – Columbo 2014-10-29 10:06:24

+0

编辑得更清楚。对不起,以后通常会回答一些答案和评论。 – ABCplus 2014-10-29 10:13:07

回答

1

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

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

清洁和简单。与其他答案不同(都是好的),没有额外的变量被声明或定义。 – ABCplus 2014-10-29 15:02:12

0

怎么是这样的:

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

if (debugEnabled) 
    executeDebugCode() 

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

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不能用于其他功能,并且为了可维护性,可能值得在函数的末尾添加#undef SHOULD_EXECUTE_DEBUG_CODE以防止意外误用。

+0

我不知道我可以在一个函数里面定义一个宏...很高兴知道 – ABCplus 2014-10-29 10:17:41

+0

我个人不喜欢的是使用宏插入(local)变量的名称。考虑你是否想在你的代码库的另一个地方使用这个“预处理器开关”。 – Sambuca 2014-10-29 10:38:19

+0

@Sambuca如果'inputParam'是一个局部变量(现在重新读取,看起来好像是这样),那么我同意,并且我会确保在函数结束时使用'#undef'。 – hvd 2014-10-29 11:02:28

0

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

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

if (inputParam || MY_DEBUG) 
     executeDebugCode(); 
0

我的做法是这样的

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

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

这样,你的if语句表示马上,你检查的预处理器定义和另一个(布尔)条件。