Simulater / Сгенерированный диапазон оператора switch в c - PullRequest
0 голосов
/ 13 января 2011

Есть ли хак для поддержки регистра диапазона в операторе переключателя ac (99?) Или target C?Я знаю, что это не поддерживается, чтобы написать что-то вроде этого:

switch(x)
   case 1:
   case 2..10:
   case 11:

Но я думал, что должен быть способ генерировать код с помощью макроса #define.Конечно, я могу определить макрос со списком дел, но я надеялся на более изящный способ, такой как CASERANGE (x, x + 10), который бы генерировал:*

Ответы [ 3 ]

3 голосов
/ 13 января 2011

GCC имеет расширение к языку C , которое допускает нечто похожее на ваш первый пример, но кроме этого, если бы существовал переносимый / ANSI способ сделать это, это было бы сделано к настоящему времени,Я не верю, что есть один.

2 голосов
/ 14 января 2011

В современном C (C99, с макросами переменной длины) это можно сделать с помощью макросов. Но вы, вероятно, не захотите кодировать это полностью самостоятельно. P99 предоставляет набор инструментов для этого. В частности, есть мета-макрос P99_FOR, который позволяет развернуть списки аргументов конечной длины.

#define P00_CASE_FL(NAME, X, I) case I: NAME(X); break
#define CASES_FL(NAME, ...) P99_FOR(NAME, P99_NARG(__VA_ARGS__), P00_SEQ, P00_CASE_FL, __VA_ARGS__)

расширится CASES_FL(myFunc, oi, ui, ei) до чего-то типа

case 0: myFunc(oi); break; case 1: myFunc(ui); break; case 2: myFunc(ei); break

Редактировать: , чтобы ответить на конкретный вопрос

#define P00_CASESEP(NAME, I, X, Y) X:; Y
#define P00_CASERANGE(NAME, X, I) case ((NAME)+I)
#define P99_CASERANGE(START, LEN) P99_FOR(START, LEN, P00_CASESEP, P00_CASERANGE, P99_REP(LEN,))

, где P00_CASESEP просто обеспечивает наличие :; между случаями, а P99_REP создает список с LEN пустыми аргументами.

Вы бы использовали это, например, как

switch(i) {
P99_CASERANGE('0',10): return i;
}

Соблюдайте : после макроса, чтобы он был как можно ближе к обычному синтаксису регистра, а также что параметр LEN должен расширяться до простого десятичного числа, а не выражения или около того.

2 голосов
/ 13 января 2011

Выполнение этого с макросами близко или невозможно.Существуют расширения компилятора, но они зависят от компилятора и не являются кроссплатформенными / стандартными.Не существует стандартного способа сделать это, используйте вместо этого цепочки if / else.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...