通常,預處理器宏用於控制某些代碼組是否被編譯。這是一個例子。如何用if語句替換預處理器宏?
#define ENABLE 1
void testswitch(int type){
switch(type){
case 1:
std::cout << "the value is 1" << endl;
break;
case 2:
std::cout << "the value is 2" << endl;
break;
#ifdef ENABLE
case 3:
std::cout << "the value is 3" << endl;
break;
case 4:
std::cout << "the value is 4" << endl;
}
#endif
}
}
現在我想刪除所有這些預處理宏與if
條件
void testswitch(int type, bool enable){
switch(type){
case 1:
std::cout << "the value is 1" << endl;
break;
case 2:
std::cout << "the value is 2" << endl;
break;
if (enable) {
case 3:
std::cout << "the value is 3" << endl;
break;
case 4:
std::cout << "the value is 4" << endl;
}
}
}
取代它們。然而,上面的代碼並沒有像以前那樣具有相同的邏輯。無論變量enable
是否爲true
或false
,case 3
和case 4
始終啓用。這些代碼在VS2010下進行測試。
Q1:編譯器是否忽略if
條件?
爲了實現我的目標,我必須要改變這些代碼如下:
void testswitch(int type, bool enable){
switch(type){
case 1:
std::cout << "the value is 1" << endl;
break;
case 2:
std::cout << "the value is 2" << endl;
break;
case 3:
if (enable)
std::cout << "the value is 3" << endl;
break;
case 4:
if (enable)
std::cout << "the value is 4" << endl;
}
}
但似乎有在代碼冗餘if
。 有沒有更好的方法來做到這一點?
1語法是完全錯誤的。第二種方法值得懷疑,因爲建議不要使用'#ifdef',結果是非常不同的。 – 2014-10-09 06:56:45
由於第一種語法錯誤,爲什麼代碼可以在VS中成功構建?我可以考慮這是VS2010中的一個錯誤嗎? – zangw 2014-10-09 07:05:52
@zangw從「這是一個語法錯誤」的意義上來說,語法沒有錯,但是在「它甚至不能完成你想要的東西」這個意義上。 – Angew 2014-10-09 07:11:59