Замена #define - PullRequest
       17

Замена #define

2 голосов
/ 04 октября 2010

Я хочу заменить

#define INTERVAL_MASK(b) (1 << (b))

встроенной функцией.

int INTERVAL_MASK(int b)
{
    return (1 << b);
}

Но у меня есть switch case, который использует директиву препроцессора в инструкциях caseКак перейти к преобразованию этого?Замена switch на if - единственный вариант?

Ответы [ 4 ]

6 голосов
/ 04 октября 2010

Метка регистра переключателя должна иметь целочисленное константное выражение, поэтому вы не можете вызывать функцию в метке регистра.

Нет ничего плохого в использовании макроса для этого.

Если вы действительно обеспокоены использованием макроса, #define это непосредственно перед оператором switch и #undef сразу после оператора switch.

В C ++ 0x вы 'Я смогу создать constexpr функций, которые можно использовать в константных выражениях, но, насколько мне известно, ни один компилятор фактически полностью не поддерживает эту часть C ++ 0x.

0 голосов
/ 04 октября 2010

Насколько я знаю, функции, содержащие операторы управления, такие как switch, if и циклы, не являются встроенными.

Вы можете быть уверены, что используете макрос.

0 голосов
/ 04 октября 2010

Важно отметить, что в операторе switch значения регистра могут быть только постоянными целочисленными выражениями.

Единственный обходной путь, который я могу придумать для вас, - это набор утверждений if-else. Или вы можете просто сгенерировать случаи от 2 (1 << 1) до 1024 (1 << 10) или до любого предела, программно Значит, ваш оператор switch будет выглядеть так: </p>

switch(i) {
    case 2:
        //random stuff
        break;
    ...
    case 1024:
        //random
        break;
    ...
}

Там будет отдельный код, который будет генерировать это. Это не будет так сложно на самом деле.

0 голосов
/ 04 октября 2010

Почему бы не const int interval_mask = (1 << b);?

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