ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
22 июля
1054877 Топик полностью
il-2 (24.11.2020 13:48, просмотров: 222) ответил SciFi на Творческая задачка. Можно ли на Си придумать такой макрос, который из строки "abcd" сделает константу, пригодную для использования в метках case, чтобы было как "case 0x61626364", ну или "case 0x64636261", индейцы не принципиальны?
Как два пальца (не проверял, но что-то в этом роде должно заработать) :-) 
#define SWITCH(x) for(uint32_t _switch_ = x, _cond_ = 1; _cond_;)
#define CASE(y)   if ( _switch_ == ( ((uint8_t *)(y)[0]) + ((uint8_t *)(y)[1])*0x100u + ((uint8_t *)(y)[2])*0x10000ul + ((uint8_t *)(y)[3])*0x1000000ul ) )
#define DEFAULT   _cond_ = 0;

SWITCH(var)
{
    CASE("EKLM")
    {
        ....
        break;
    }
    DEFAULT
    {
        ....
        break;
    }
}