通常,预处理器宏用于控制某些要编译的代码组。这是一个例子。
#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
。 有没有更好的方法呢?
答案 0 :(得分:2)
编译器不会忽略if
条件。但您必须记住,case
标签是标签。 switch
只是goto
更有条理的方法。由于goto
可以跳转到由if
(或循环或其他任何其他)控制的块中,所以switch
也可以。{/ p>
您可以将enable
- 只包含在一个单独的开关中:
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;
default:
if (enable) {
switch(type) {
case 3:
std::cout << "the value is 3" << endl;
break;
case 4:
std::cout << "the value is 4" << endl;
break;
}
}
break;
}
}
答案 1 :(得分:1)
另一个解决方案是将其重构为两个switch
语句,第二个语句由if (enable)
控制:
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;
default:
break;
}
if (enable) {
switch(type) {
case 3:
std::cout << "the value is 3" << endl;
break;
case 4:
std::cout << "the value is 4" << endl;
break;
default:
break;
}
}
}
答案 2 :(得分:0)
如果enable
是一个常量(或者在编译时已知),一个相当聪明的编译器(如gcc)将不会生成代码来检查enable
的值,但不会生成代码(如果已知它是假的)或者生成then语句。