2012-06-19 4 views
6

단위 테스트 프레임 워크로 작업하면서 매크로 인수를 테스트하고 싶습니다. 간단히 말해서, 매크로 FOO(x)을 확장하여 이 short이고 FOO(anything_else)long이되도록합니다.선행 처리기 인수를 조건부로 바꿀 수 있습니까?

C++ 템플릿을 사용하면 물론 문제가되지 않습니다. 그러나 여기에 typedef이 아니라 실제 토큰 교체가 필요합니다. 나는. FOO(char) FOO(char) i;long long i;과 같은 유효한 정의 여야합니다.

+1

최신 C 표준은 매크로의 대체 텍스트가 첫 번째 인수의 표현 유형에 의존 할 수있는 기능을 가지고 있습니다. 이것을 빌딩 블록으로 사용할 수 있습니다. –

+0

boost.pp에 대해 살펴 보았으며 그와 함께 somethign을 해킹 할 수 있다면? – PlasmaHH

+1

@StefanMajewsky : 내가 믿는 제네릭을 말하는거야? – dirkgently

답변

0

당신이하려는 것은 불가능합니다.

매크로는 컴파일러가 실행되기 전에 이름이 의미하는 c 전처리기에 의해 평가됩니다. 그것은 당신의 상징의 유형이 아직 무엇인지 알지 못합니다.

컴파일러에서 평가할 때 적절한 유형으로 캐스팅하는 형식의 클래스를 만들면 어떨까요?

+0

유형에 신경 쓰지 않습니다. 전처리 단계에서 'int'는 단지 토큰이라는 것을 알고 있습니다. 여전히, 나는'int' 토큰에 조건부로 행동하려고합니다. – MSalters

3

내가 아는 한, C 매크로에서 사용할 수있는 유일한 문자열과 같은 연산은 (#을 사용하여) 토큰을 붙여 넣기/병합 (## 사용) 및 문자열 화입니다.

은 당신이받을거야 가장 가까운 그래서 같은 가능성을 열거 포함 확신 : this question에서

#define FOO(x) FOO__##x 
#define FOO__int short 
#define FOO__short long 
#define FOO__long long 
#define FOO__char long 
// ... for each type you want to replace 

영감.

+0

(편집 # 2) : 제한된 "elses"세트가있는 경우 모두 나열 할 수 있습니다. – flolo

+0

그래, 나는 지금 그것을 깨달았고, 전체 게시물을 정리했다. – vergenzt

+0

나는 내 주장을 열거 할 수 있다고 생각하지 않는다. 나는'FOO (AcmeWidgetUnitTest17)'을 얻을지도 모른다 :( – MSalters

관련 문제