在 C 中使用 table 而不是 switch case

use a table instead of switch case in C

在这种情况下,如何用 table 替换 switch case?

typedef enum
{   DIV_1 = 1,
    DIV_2,
    DIV_4 = 4,
    DIV_8 = 8,
    DIV_16 = 16
} eDiv_t;

eDiv_t Division;

uint32_t dividerValue;

    switch (Division)
    {

        case DIV_1:
            dividerValue = RCC_DIV_1;
        break;
        case DIV_2:
            dividerValue = RCC_DIV_2;
        break;
        case DIV_4:
            dividerValue = RCC_DIV_4;
        break;
        case DIV_8:
            dividerValue = RCC_DIV_8;
        break;
        case DIV_16:
            dividerValue = RCC_DIV_16;
        break;
        default:
            dividerValue = RCC_DIV_1;
        break;
    }

我不知道如何将枚举变量影响到数组并使用它代替 switch case

您可以将您的枚举定义为连续的整数值并使用此枚举索引您的数组:

typedef enum
{   DIV_1 = 0,
    DIV_2,
    DIV_4,
    DIV_8,
    DIV_16,
    NB_DIV
} eDiv_t;

unsigned int dividerValue[NB_DIV] = {RCC_DIV1, RCC_DIV2, ..., RCC_DIV16};

在这种特定情况下,由于 eDiv_t 在别处使用而无法更改,因此可以按以下方式查找 table:

RCC_t eDiv_to_RCC (eDiv_t ediv)
{
  static const RCC_t lookup [16+1] = 
  {
    [DIV_1]  = RCC_DIV1,
    [DIV_2]  = RCC_DIV2,
    [DIV_4]  = RCC_DIV4,
    [DIV_8]  = RCC_DIV8,
    [DIV_16] = RCC_DIV16,
  };

  return lookup[ediv];  // returns 0 if invalid input
}

这非常快,但会消耗 17 * sizeof(RCC_t),我认为这是另一个枚举,可能有 8 到 32 位大。不是那么大,但这是超过 .rodata 大小优化的执行速度。另一方面,实际代码将比 switch 版本花费更少 space。