gpt4 book ai didi

c++ - 如何用 if 语句替换预处理器宏?

转载 作者:搜寻专家 更新时间:2023-10-31 01:42:47 27 4
gpt4 key购买 nike

通常,预处理器宏用于控制某些代码组是否被编译。这是一个例子。

#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;
}
}
}

但是,上面的代码和之前的逻辑不一样。无论变量enabletrue还是falsecase 3case 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有更好的方法吗?

最佳答案

编译器不会忽略 if 条件。但是您必须记住,case 标签是标签。 switch 只是goto 的一种更有条理的方法>。由于 goto 可以跳转到由 if(或循环,或任何其他)控制的 block 中,所以 switch 也可以。

您可以将仅启用 的情况放在单独的开关中:

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;
}
}

关于c++ - 如何用 if 语句替换预处理器宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26272033/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com