Можно ли получить количество случаев в случае переключения в C без ручного добавления переменной-счетчика, которая увеличивается в каждом случае?
Получение количества случаев в switch-case в C
Ответы (3)
Как я уже говорил ранее, я думаю, вам нужна таблица диспетчеризации, а не оператор 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. Это не только упрощает добавление дополнительных случаев, но также позволяет подсчитывать случаи. Если у вас есть огромная таблица и редкие случаи, вы можете использовать хеш-таблицу вместо простого массива.
РЕДАКТИРОВАТЬ: Конечно, у таблицы диспетчеризации есть еще больше преимуществ, чем у переключателя, поскольку вы можете динамически добавлять, удалять и изменять таблицу диспетчеризации. Это может быть самым большим преимуществом.
Это ужасно, но если вы используете 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
(Надеюсь, вы работаете в Linux и используете последний компилятор GCC )
Если вы хотите подсчитать фактическое количество наблюдений, которое видит компилятор (подумайте о диапазоны регистра), вам нужно знать внутренние представления компилятора, и вы могли бы, если компилируете с недавним GCC, настройте свой компилятор с помощью GCC MELT и создайте свой собственный MELT расширение.
Кстати, сложность или эффективность оператора switch
связана не только (или в основном) с количеством случаев (поскольку распределение случаев имеет большое значение). См. ссылки здесь.
Возможно, вы могли бы просто использовать режим findgimple
для GCC MELT, чтобы найти switch
операторов gimple, которые достаточно широки.
Возможно, вам нужны вычисленные переходы для поточный код...
break
? - person Peter Miehle   schedule 10.02.2016