c语言 - 在开关机箱结构中使用'return'与'break'有什么好处吗?



>我正在研究一个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是函数指针数组,每个指针指向一个包含特定于模式的检查的函数。(这将带来函数调用开销,但分支要少得多。

最新更新