2014-10-29 327 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語句表示馬上,你檢查的預處理器定義和另一個(布爾)條件。