>我正在研究一个32位MCU的代码,其中我看到一个Switch-case结构,它只在每个案例中使用"return",而不是通常的"break"语句。这样做有什么好处?
通常,所有 Switch-case 语句都使用 break 退出它。但是,如果使用"return"而不是"break",它会提供更快的代码或更小的代码,或者以这种方式这样做的其他好处吗?
switch (adv_mode)
{
case BLE_ADV_MODE_DIRECTED_HIGH_DUTY:
if ( (p_advertising->adv_modes_config.ble_adv_directed_high_duty_enabled)
&& (!p_advertising->adv_modes_config.ble_adv_extended_enabled)
&& (peer_addr_is_valid))
{
return BLE_ADV_MODE_DIRECTED_HIGH_DUTY;
}
// Fallthrough.
case BLE_ADV_MODE_DIRECTED:
if ((p_advertising->adv_modes_config.ble_adv_directed_enabled) && peer_addr_is_valid)
{
return BLE_ADV_MODE_DIRECTED;
}
// Fallthrough.
case BLE_ADV_MODE_FAST:
if (p_advertising->adv_modes_config.ble_adv_fast_enabled)
{
return BLE_ADV_MODE_FAST;
}
// Fallthrough.
case BLE_ADV_MODE_SLOW:
if (p_advertising->adv_modes_config.ble_adv_slow_enabled)
{
return BLE_ADV_MODE_SLOW;
}
// Fallthrough.
default:
return BLE_ADV_MODE_IDLE;
}
我希望位"返回"和"中断"将给出相同的结果。所以它只是程序员使用的一种偏好。
return
离开switch
所在的函数并跳回到其调用方。
break
只留下switch
和执行后的下一条语句。
在所示的情况下,函数返回某种模式。如果使用了break
则必须设置此结果的变量,并在函数末尾返回。有时开发人员会发现这太多了,无法编写。
性能方面没有优势或劣势。没有理由相信包含临时结果变量和break
的版本会产生任何不同的机器代码。
但是,需要提到的是,这只是编写if
链的一种非常丑陋的方式。 switch
故障是非常糟糕和危险的做法,永远不应该使用。应重写此代码,使其在以下方面都更加健壮和可读:
if(adv_mode == BLE_ADV_MODE_DIRECTED_HIGH_DUTY && this && that)
{
result = BLE_ADV_MODE_DIRECTED_HIGH_DUTY;
}
else if(...)
{
result = BLE_ADV_MODE_DIRECTED;
}
或者,如果常量是从 0 到 n 的相邻枚举,只需将整个内容替换为:
return check(p_advertising)[adv_mode];
其中check
是函数指针数组,每个指针指向一个包含特定于模式的检查的函数。(这将带来函数调用开销,但分支要少得多。