在C中获取switch案例中的案例数

时间:2016-02-10 10:02:00

标签: c switch-statement counting case-statement

是否可以在C中切换案例中的案例数而无需手动添加在每种情况下递增的计数器变量?

3 个答案:

答案 0 :(得分:6)

这太可怕了,但是如果你在gcc下,你可以使用COUNTER宏:

#include <stdio.h>

#define ncase (void)__COUNTER__; case

int main(void)
{
    int n = __COUNTER__ + 1;

    switch (1 + 1) {
        ncase 0: break;
        ncase 1: break;
        ncase 2: break;
    }
    n = __COUNTER__ - n;
    printf("%d cases\n", n);
    return 0;
}

输出:

3 cases

答案 1 :(得分:6)

正如我之前评论的那样,我认为您需要一个调度表而不是一个switch语句。这是一个小例子。

说你得到了这个:

int find_the_case();
void do_something();
void do_something_different();
void do_something_completly_different();
void do_default();

int main(int argc, char *argv[])
{
    int c = find_the_case();
    switch(c){
        case 0:
           do_something();
           break;
        case 1:
           do_something_different();
           break;
        case 5:
           do_something_completly_different();
           break;
        default:
           do_default();
           break;
    }
    return 0;
}

现在可以改写这个:

#define MAX_NUMBER_OF_CASES 6
int main_dispatchtable()
{
    void (*table[MAX_NUMBER_OF_CASES])(void)  = {
            [0] = do_something,
            [1] = do_something_different,
            [5] = do_something_completly_different
    };

    int c = find_the_case();
    if( table[c] )
            table[c]();
    else
            do_default();

    /* for the counting */
    int count = 0;
    for (int i = 0; i < MAX_NUMBER_OF_CASES; i++ )
            if( table[i] ) count++;

    return 0;
}

这通常比使用switch语句好得多。它不仅使添加更多案例变得更加简单,而且还允许对案例进行计数。如果你有一个庞大的表和稀疏的情况,你可以使用哈希表而不是普通数组。

编辑: 当然,调度表比交换机情况更有优势,因为您可以动态添加和删除和更改调度表。这可能是最大的优势。

答案 2 :(得分:1)

(我希望您使用的是Linux并使用最近的 GCC编译器)

如果你想计算编译器看到的实际个案例数(想想case ranges),你需要知道编译器的内部表示,如果编译你也可以使用最近的GCC,使用GCC MELT自定义编译器并编写我们自己的MELT扩展。

BTW,switch语句的复杂性或效率不仅(或大部分)与案例数量相关(因为案例的分布很重要)。请参阅参考资料here

也许您可以简单地使用findgimple modeGCC MELT来查找足够广泛的switch个简单语句。

对于computed gotos ...

,您可能需要threaded code