2011-04-20 4 views
1

(즉 C#을에 포트 앱) 및 사용 바이트를 작성하고 내가 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 수레 - 4 개 기능 코드는 10 개 * 10 개 * 4 개 라인),하지만 미래에 나는 매크로를 지원하지 않는 언어로 옮기고 싶다. (나는 C#이나 Java를 생각하고있다.) 내가 생각해 낸 아이디어는 코드 생성기를 만들어서 vm 코드에 붙여 넣을 코드를 생성하지만 코드를 읽을 수 없으며 sth을 변경하고 유지하기가 어려울 것입니다. 어쩌면 공유 할 멋진 아이디어가 있을까요? :)

+0

, 나는 당신이 그것으로 것을 할 수 있었던 확신 손 :)으로 코드를 구조 조정하는 것입니다. –

답변

1

하나의 옵션은 외부 매크로 프로세서 (예 : M4)로 이동 한 다음 빌드 프로세스의 일부로 만들어서 컴파일하기 전에 매크로 확장 버전을 생성하는 것입니다. 기본적으로 C 프리 프로세서에서 외부 프리 프로세서 (예 : M4)로 이동하면됩니다.

또 다른 대안은

Camlp4 처리기는 F 번호를 사용할 수없는 것이 너무 나쁜
관련 문제