C ++ - как устранить макросы? (портировать приложение в т. е. c #) - PullRequest
1 голос
/ 20 апреля 2011

Я создал простую виртуальную машину, и для создания байтов инструкций и переключения я использую макросы c ++, это выглядит так (это упрощенный пример):

typedef t_sint_b32 int;
typedef t_sint_b16 short;
(...)
typedef t_sfloat_b32 float;

enum InstructionOpSize{b8,b16,b32,b64};
enum InstructionOpSign{s, u};
enum InstructionOpType{int_, float_};
enum InstructionFunc{MOV, ADD, SUB, ...};

#define CreateInstruction(size1, sign1, type1, size2, ...) ((size1) | (sign1 << 3) | (type1 << 4) | ...)
#define CASE_INSTRUCTION(size1, sign1, type1, size2, ..., operation) case CreateInstruction(size1, sign1, type1, size2, ...): ((t_##sign1##type1##size1) ARG1) operation ((t_##sign2##type2##size2) ARG2); break;

#define MULTI_CASE(size1, sign1, type1, ...)\
CASE_INSTRUCTION(size1, sign1, type1, b8, u, int_,...);\
(...)
CASE_INSTRUCTION(size1, sign1, type1, b64, s, float_,...);

#define MULTI_MULTI_CASE(...)\
MULTI_CASE(b8, u, int_,..);\
(...)
MULTI_CASE(b64, s, float_,..);

И тут есть огромный переключатель:

switch(opcode){
MULTI_MULTI_CASE(ADD, +=);
MULTI_MULTI_CASE(SUB, -=);
MULTI_MULTI_CASE(MUL, *=);
(...)
}

Как вы можете видеть, есть много кода, сгенерированного без особых усилий (всего 10 типов переменных - 8 int и 2 float - и 4 функции - это 10 * 10 * 4 строки кода), но в будущем я бы хотел бы переместить его на язык, не поддерживающий макросы (я думаю о c # или Java). Единственная идея, которую я придумал, - создать генератор кода, который будет генерировать код для вставки в код vm, но тогда код не будет читабельным, и будет сложно изменить и сохранить. Может быть, у вас есть отличные идеи, чтобы поделиться? :)

1 Ответ

1 голос
/ 20 апреля 2011

Один из вариантов - перейти к внешнему макропроцессору (например, M4), а затем включить его в процесс сборки для создания макроподвернутой версии до ее компиляции.По сути, вы просто переходите от препроцессора C к внешнему препроцессору (например, M4).

Другой альтернативой является реструктуризация кода вручную:)

...