// opcode.h // feltételezve, hogy a getvar, result, stb. definiálva van. nyilván lehet komplexebb módon is, de ez egy példa DEFINE_OPCODE(add, Result() = GetVar(0) + GetVar(1)) DEFINE_OPCODE(sub, Result() = GetVar(0) - GetVar(1)) DEFINE_OPCODE(jmp, InstructionPointer() = GetVar(0)) // akármi.cpp // opcode function definitions #define DEFINE_OPCODE(name, ...) \ void opcode_##name() { \ __VA_ARGS__ ; \ } #include "opcode.h" #undef DEFINE_OPCODE // ez csak kis extra // enum class c++11 feature de mindegy enum class Opcodes { #define DEFINE_OPCODE(name, ...) \ name , #include "opcode.h" #undef DEFINE_OPCODE Count }; // nem tudom a függvény pointer pontos szintaxisát de ez az lesz std::vector<(void)*()> opcodes; void InitializeOpcodes() { #define DEFINE_OPCODE(name, ...) \ opcodes.push_back(name); \ assert(opcodes.count() == Opcodes::name + 1); #include "opcode.h" #undef DEFINE_OPCODE assert(opcodes.count() == Opcodes::Count); } // ezután pl opcodes[Opcodes::add] egy pointer lesz az opcode_add() függvényre // nyilván a függvényeknek át kell adni valamilyen paramétert (asm stream), azt nem vettem ebbe bele