Как указать размер перечисления в GCC?

Я хочу указать размер перечисления 64 бита для перечисления. Как это возможно через GCC? Код не обязательно должен быть «переносимым», поскольку меня интересует только заставить код работать при компиляции GCC для x86-32 и x86-64 Linux. Это означает, что любой взлом, который может обеспечить нужную мне функциональность, хорош, если он работает для этих целей.

Учитывая этот код:

#include 
#include 

enum some_enum
{
    garbage1,
    garbage2
};

int main(void)
{
    enum some_enum some_val;
    printf("size: %lu\n", sizeof(some_val));

    return EXIT_SUCCESS;
}

В настоящее время выводится 4, тогда как я хочу иметь возможность принудительно установить размер равным 8. Попытка указать значения в присваивании перечисления больше 4 байтов вызывает предупреждение. Например,

enum some_enum
{
    garbage1 = '12345',
    garbage2
};

даст:

warning: character constant too long for its type [enabled by default]

ответ на аналогичный вопрос здесь не дает хороших результатов. То есть такое же предупреждение создается в результате:

enum some_enum
{
    garbage1 = 'adfs',
    garbage2 = 'asdfasdf'
};

Примечание: многосимвольное предупреждение может быть отключено путем компиляции с помощью -Wno-multichar .


Обоснование

Поскольку людей интересует, почему я это делаю, я написал движок дизассемблера. Я получаю каждую часть инструкции в виде строки. Итак, я хочу, чтобы перечисление выглядело так:

enum mnemonic
{
    mov = 'mov',
    cmp = 'cmp',
    sysenter = 'sysenter'
};

Затем я могу легко сохранить семантическую информацию с помощью некоторого кода вроде этого:

enum mnemonic insn;

char *   example_insn = "mov";
uint64_t buf          = 0;

strncpy((char *)&buf, example_insn, sizeof(uint64_t));

Если бы buf был мнемоникой перечисления , тогда нам нужно больше ничего не делать. strncpy используется для дополнения байтов после конца строки нулевыми символами.Если я не могу это сделать, мне придется сделать что-то вроде этого:

if(strcmp(example_insn, "mov") == 0) {
    insn = mov;
} else if(strcmp(example_insn, "cmp") == 0) {
    insn = cmp;
} ...

Поскольку эта процедура будет выполняться миллионы раз, такая оптимизация будет иметь огромное значение. Я намерен сделать то же самое и для операндов, таких как регистры.

8
задан Community 23 May 2017 в 12:26
поделиться