Использование предварительной обработки C для получения целочисленного значения string

Как мне создать макрос C , чтобы получить целочисленное значение строки? Конкретный вариант использования следует из вопроса здесь . Я хочу изменить код следующим образом:

enum insn {
    sysenter = (uint64_t)'r' << 56 | (uint64_t)'e' << 48 |
               (uint64_t)'t' << 40 | (uint64_t)'n' << 32 |
               (uint64_t)'e' << 24 | (uint64_t)'s' << 16 |
               (uint64_t)'y' << 8  | (uint64_t)'s',
    mov = (uint64_t)'v' << 16 | (uint64_t)'o' << 8 |
          (uint64_t)'m'
};

На это:

enum insn {
    sysenter = INSN_TO_ENUM("sysenter"),
    mov      = INSN_TO_ENUM("mov")
};

Где INSN_TO_ENUM заменяется на тот же код. Производительность будет такой же, но удобочитаемость значительно повысится.

Я подозреваю, что в такой форме это может быть невозможно из-за неспособности препроцессора C обрабатывать строки, поэтому это также будет нежелательным, но приемлемым решением (макрос с переменным аргументом):

enum insn {
    sysenter = INSN_TO_ENUM('s','y','s','e','n','t','e','r'),
    mov      = INSN_TO_ENUM('m','o','v')
};

10
задан Community 23 May 2017 в 10:28
поделиться