c++ -如何消除宏?(将应用移植到c#中)
C++ - how eliminate macros? (to port app into i.e. c#)
我创建了一个简单的虚拟机,我使用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代码中,但是代码将不具有可读性,并且很难更改和维护。也许你有一些很棒的想法要分享?:)
一种选择是移动到外部宏处理器(例如M4),然后使其成为构建过程的一部分,以便在编译之前生成宏扩展版本。基本上你只需要从C预处理器移动到外部预处理器(例如M4)。
另一种方法是手工重构代码:)
相关文章:
- 试图在visual studio上用C++创建一个桌面应用程序
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- c++r值引用应用于函数指针
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 在C应用程序中运行C++(带有STL)函数
- 使用VerQueryValue检索应用程序的文件描述
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用调试/崩溃报告将应用程序部署到客户端
- C++控制台应用程序阻止退出
- Python中的for循环与C++有何不同
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 将应用程序从32位移植到64位时出现问题
- 如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐
- 有没有任务栏API可以立即应用注册表更改
- 如何改变c++应用程序的视觉效果
- WM_CTLCOLORSTATIC从未在WIN32应用程序中触发
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 示例外壳应用程序显示的 V8 "segmentation fault (core dumped)"错误
- phytec phyBOARD iMX-6在从闪存而不是SD卡运行qt5 opengles应用程序时表现不佳(FPS减半