2014-09-04 4 views
3

나는 다음과 같은 코드가 있습니다 :C/C++ 매크로 확장

나는

UNIT_IMPLEMENT_UNIT_TYPE(DISTANCE, METER) 

와 매크로를 호출하고있어

#define UNIT_BASIC_UNIT_DEF2 (name) UNIT_BASIC_ ## name 
#define UNIT_UNIT_TYPE_DEF2 (basic_type, name) UNIT_ ## basic_type ## _ ## name 
#define UNIT_BASIC_UNIT_CLASS_NAME2(name) CUnit ## name 
#define UNIT_UNIT_TYPE_CLASS_NAME2(basic_type, name) CUnit ## basic_type ## _ ## name 

#define UNIT_BASIC_UNIT_DEF (name) UNIT_BASIC_UNIT_DEF2(name) 
#define UNIT_UNIT_TYPE_DEF (basic_type, name) UNIT_UNIT_TYPE_DEF2 (basic_type, name) 
#define UNIT_BASIC_UNIT_CLASS_NAME(name) UNIT_BASIC_UNIT_CLASS_NAME2(name) 
#define UNIT_UNIT_TYPE_CLASS_NAME(basic_type, name) UNIT_UNIT_TYPE_CLASS_NAME2(basic_type, name) 

#define UNIT_IMPLEMENT_UNIT_TYPE(basic_type, name) \ 
CUnitAbstract& UNIT_UNIT_TYPE_CLASS_NAME(basic_type, name)::dup(){\ 
UNIT_UNIT_TYPE_CLASS_NAME(basic_type, name) * n = new UNIT_UNIT_TYPE_CLASS_NAME(basic_type, name)(this->value);\ 
return *n;\ 
}\ 
CUnitAbstract& UNIT_UNIT_TYPE_CLASS_NAME(basic_type, name) ::operator+(CUnitAbstract& value){\ 
DYNAMIC_ASSERT(dynamic_cast< UNIT_BASIC_UNIT_CLASS_NAME(basic_type) *>(&value) != NULL);\ 
CUnitAbstract * tmp = &this->dup();\ 
*tmp = this->value + conversionTable[UNIT_BASIC_UNIT_DEF(basic_type)][UNIT_UNIT_TYPE_DEF(basic_type, name)] * value.getInBasicUnit();return *tmp;\ 
} 

나는 컴파일 오류 얻을 :

error: 'basic_type' was not declared in this scope 
error: 'name' was not declared in this scope 
error: expected ']' before 'UNIT_basic_type_name' 
error: expected ';' before 'UNIT_basic_type_name' 

의미를 그 매크로는 꺽쇠 괄호 안의 마지막 줄에 넣기를 원했기 때문에 확장되지 않았습니다. 내가 뭘 잘못 했니?

+1

'UNIT_BASIC_ ## name' ->'UNIT_BASIC _ ## name'? – someuser

+1

어떤 컴파일러를 사용하고 있습니까? GCC는 잘 작동하지만 적어도 다른 오류가 발생합니다 : http://coliru.stacked-crooked.com/a/06956e449b44eee3 –

+0

나는 g ++ (두 번 확인 : GCC)를 사용하고 이것을 다음으로 변경합니다 : #define UNIT_BASIC_UNIT_DEF2 (name) UNIT_BASIC## _ 이름 #DEFINE UNIT_UNIT_TYPE_DEF2 (basic_type 이름) UNIT _ _ ## ## ## basic_type #DEFINE UNIT_BASIC_UNIT_CLASS_NAME2 (이름) Cunit의 ## 명 #DEFINE UNIT_UNIT_TYPE_CLASS_NAME2 (basic_type 이름) Cunit의 ## basic_type ## _ 이름 ## name 도움이되지 않았습니다. 같은 오류. –

답변

6
#define UNIT_BASIC_UNIT_DEF2 (name) UNIT_BASIC_ ## name 
#define UNIT_UNIT_TYPE_DEF2 (basic_type, name) UNIT_ ## basic_type ## _ ## name 
... 
#define UNIT_BASIC_UNIT_DEF (name) UNIT_BASIC_UNIT_DEF2(name) 
#define UNIT_UNIT_TYPE_DEF (basic_type, name) UNIT_UNIT_TYPE_DEF2 (basic_type, name) 

매크로 이름과 인수 목록 사이의 공백을 제거하십시오. 이 같아야합니다

#define UNIT_BASIC_UNIT_DEF2(name) ... 
//       ^^^ 
//      no space here! 

이런 공간이있을 때 :

#define FOO (params) replacement 

기호가 직접 교체 목록으로 대체 누가 받 객체와 같은 매크로를 정의 어떤 매개 변수 치환으로, . 따라서이 같은 호출 :

FOO(bar) 

이 확장됩니다 :

(params) replacement 

공간을 제거함으로써, 당신은 같은 기능과 같은 매크로를 얻을 목적 :

#define FOO(params) replacement 

FOO(bar)replacement으로 올바르게 확장됩니다.

+0

맞습니다! 그것은 트릭을 했어! –