【问题标题】:C++ - how eliminate macros? (to port app into i.e. c#)C++ - 如何消除宏? (将应用程序移植到即 c# 中)
【发布时间】:2011-08-09 16:17:35
【问题描述】:

我创建了简单的虚拟机,并且为了创建指令字节和开关,我使用 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 个整数和 2 个浮点数 - 以及 4 个函数,它的 10*10*4 行代码),但在未来我会喜欢将其移至不支持宏的语言(我在考虑 c# 或 Java)。我想出的唯一想法是制作代码生成器,它将生成代码以粘贴到 vm 代码中,但是代码将不可读,并且很难更改和维护。也许你有一些很棒的想法要分享? :)

【问题讨论】:

  • 很遗憾,Camlp4 预处理器不适用于 F#,我相信你可以用它来做到这一点。

标签: c# c++ macros port vm-implementation


【解决方案1】:

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

另一种选择是手动重构代码:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-25
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多