2016-02-09 3 views
3

Я пытаюсь сделать перечисления для инструкций по сборке,Ошибки при использовании перечисления в C

typedef enum opcode {load, loada, store, mov, add, sub, mul, div, mod, cmp, b, blt, ble, bne, beq, bge, bgt, read, write}OP_CODE; 

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

DEF.h:13:62: error: ‘div’ redeclared as different kind of symbol 
typedef enum opcode {load, loada, store, mov, add, sub, mul, div, mod, cmp, b, 

Кто-нибудь знает, как решить эту проблему. Я не могу изменить слова или буквы. Thanks

+2

Похоже, что 'div' уже объявлен до определения' opcode'. Пожалуйста, напишите [Минимальный, Полный и Подтверждаемый пример] (http://stackoverflow.com/help/mcve). –

+2

'extern div_t div (int __numer, int __denom)' в stdlib.h. –

+0

'div' - это функция библиотеки как в C, так и в C++, объявленная в' stdlib.h' и 'cstdlib' соответственно. – dxiv

ответ

2

div является библиотечной функцией, поэтому вы не должны использовать одно и то же имя. Поэтому вам следует «изменить слова или буквы букв» (или изменить компилятор на C++ и использовать пространство имен, чтобы изолировать ваше перечисление).

Вы можете переименовать всех членов вашего перечисления, например.

typedef enum opcode {LOAD, LOADA, STORE, MOV, ADD, SUB, MUL, DIV, MOD, CMP, B, BLT, BLE, BNE, BEQ, BGE, BGT, READ, WRITE} OP_CODE; 

или

typedef enum opcode {op_load, op_loada, op_store, op_mov, op_add, op_sub, op_mul, op_div, op_mod, op_cmp, op_b, op_blt, op_ble, op_bne, op_beq, op_bge, op_bgt, op_read, op_write} OP_CODE; 

Я предпочитаю последний вариант (с префиксом добавляется к именам всех значений opcode)

+0

OP сказал (а), что он не может изменить дело. И имена. –

+0

Мне нужно сохранить имя ans case. – Hukh

+0

Итак, оставьте тег C++, удалите C и сделайте имена темпами с нестандартным именем. Можете ли вы объяснить ограничение имен? Ваша IDE не поддерживает «переименование во всех файлах» или какая-либо другая причина? – VolAnd

4

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

Вы можете создать -структуру

typedef struct {int load, loada, store, mov, add, sub, mul, div, mod, cmp, b, 
       blt, ble, bne, beq, bge, bgt, read, write; 
} OP_CODE; 

член Присвоить значения

OP_CODE op; 
op.load = 1; 
op.loada = 2; 
... 

и использовать op.опкод везде, где это необходимо.


Использование #define

Другой обходной путь, который будет делать именно то, что вы хотите, не очень чистый

  • #define должны быть объявлены после заголовков включает
  • вы не можете использовать определения, которые вы определить из библиотек больше

, например

#include <stdlib.h> 
... 
#define load 1 
#define loada 2 
.... 

Затем вы можете использовать имена как

if (opcode == div) { 
    // do div stuff 
} 

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

2

div - стандартная функция [определена в stdlib.h]. Поскольку вы не можете изменить имена [или случай], существует несколько обходных решений.

Первый:

#define div __not_div__ 
#include <stdlib.h> 
#undef div 

typedef enum opcode { 
    load, 
    loada, 
    store, 
    mov, 
    add, 
    sub, 
    mul, 
    div, 
    mod, 
    cmp, 
    b, 
    blt, 
    ble, 
    bne, 
    beq, 
    bge, 
    bgt, 
    read, 
    write 
} OP_CODE; 

Второе:

#include <stdlib.h> 

typedef enum opcode { 
    load, 
    loada, 
    store, 
    mov, 
    add, 
    sub, 
    mul, 
    _div, 
    mod, 
    cmp, 
    b, 
    blt, 
    ble, 
    bne, 
    beq, 
    bge, 
    bgt, 
    read, 
    write 
} OP_CODE; 

#define div _div 

Третий [использовать #define вместо enum]:

#include <stdlib.h> 

#define load 0 
#define loada 1 
#define store 2 
#define mov  3 
#define add  4 
#define sub  5 
#define mul  6 
#define div  7 
#define mod  8 
#define cmp  9 
#define b  10 
#define blt  11 
#define ble  12 
#define bne  13 
#define beq  14 
#define bge  15 
#define bgt  16 
#define read 17 
#define write 18 

Четвертый вариант заключается в просто структурируйте свой код, чтобы любой файл, который вам нужен OP_CODE делает не включает stdlib.h [или наоборот]

+0

Вы не просто скопировали мое решение * # define *, не так ли? –

+0

@ ringø Абсолютно _не_. Как умы, просто думайте одинаково. На другой странице сегодня я собирался опубликовать ответ, но кто-то отправил комментарий с моим решением, поэтому я просто оставил его, как [минута меньше минуты]. Раньше я использовал решение '# define' в своем собственном коде. –

Смежные вопросы