4

在一个微控制器程序上,我有几条指令,除了默认情况外,我想为开关中的每种情况执行这些指令。但是,我不想为每种情况编写函数调用或使用宏。

因为这是针对以 3-7Mhz 运行的微控制器,所以速度和代码空间很重要。例如:

switch(letter)
{
case a:
    ShowApple();
    printf("You entered an english letter.");
    break;
case b:
    ShowBananna();
    printf("You entered an english letter.");
    break;
...
case z:
    ShowZebra();
    printf("You entered an english letter.");
    break;
default:
    printf("You did not enter an english letter. Silly human!");
    break;
}
4

4 回答 4

5
int was_default_picked;

was_default_picked = 0;
switch (letter)
{
// ...

default:
    was_default_picked = 1;
}

if (!was_default_picked)
{
    // Your logic goes here
}
于 2012-01-20T17:37:53.817 回答
5

我要为此下地狱……

switch (foo) {
default:
    /* code for default case */
    break;
    if (0) { case 'a':
        /* ... */
    } if (0) { case 'b':
        /* ... */
    } if (0) { case 'c':
        /* ... */
    }
    /* common code for non-default cases */
}
于 2012-01-20T17:53:27.527 回答
3

为什么不使用由字母索引的函数指针数组而不是switch?这将更节省空间和速度。而且,IMO,更具可读性。

static void (*fn_table['z' - 'a' + 1])(void) = {
    &ShowApple,
    &ShowBananna,

    ...,

    &ShowZebra,
};

if (letter < 'a' || 'z' < letter)
{
    printf("You did not enter an english letter. Silly human!");
}
else
{
    (*fn_table[letter - 'a'])();
    printf("You entered an english letter.");
}
于 2012-01-20T18:33:37.697 回答
2

如果它确实是每种情况下的最后一条语句,您可以在之后使用 if 语句简单地执行它:

int wasEnglish = 1;
switch(letter)
{
case a:
    ShowApple();
    break;
case b:
    ShowBananna();
    break;
...
case z:
    ShowZebra();
    break;
default:
    wasEnglish = 0;
    break;
}

if (wasEnglish)
{
    printf("You entered an english letter.");
}
else
{
    printf("You did not enter an english letter. Silly human!");
}
于 2012-01-20T17:38:13.007 回答