c++ -如何消除宏?(将应用移植到c#中)

本文关键字:应用 何消 c++ | 更新日期: 2023-09-27 17:50:36

我创建了一个简单的虚拟机,我使用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代码中,但是代码将不具有可读性,并且很难更改和维护。也许你有一些很棒的想法要分享?:)

c++ -如何消除宏?(将应用移植到c#中)

一种选择是移动到外部宏处理器(例如M4),然后使其成为构建过程的一部分,以便在编译之前生成宏扩展版本。基本上你只需要从C预处理器移动到外部预处理器(例如M4)。

另一种方法是手工重构代码:)