2012-10-18 2 views
5

다음 코드 주어진다 :GCC 대 비주얼 스튜디오 매크로 확장

void doSomething(int one, int two, int three) 
{ 

}  

void doSomethingElse() 
{ 
    doSomething(1,2,3); 

    doSomething(1,2,3);  
} 

은 GCC 4.2은 다음을 제공하면서 :

void doSomething(int one, int two, int three) 
{ 
    //something here 
} 

#define ONE 1,2,3 

#define TWO(arg) doSomething(arg); 

#define THREE(arg) TWO(arg) 

void doSomethingElse() 
{ 
    TWO(ONE) 

    THREE(ONE) 
} 

비주얼 스튜디오 2010 다음 처리기 출력 (생략 일부 빈 라인)을 갖는다 :

void doSomething(int one, int two, int three) 
{ 

}  

void doSomethingElse() 
{ 
    doSomething(1,2,3); 

myFile.cpp:17:13: error: macro "TWO" passed 3 arguments, but takes just 1 
    TWO 
} 

표준인지는 확실하지 않지만 시각적 스터드처럼 작동하고 싶습니다. io가 작동 중입니다. 코드를 리팩토링하여 두 컴파일러에서 모두 작동하도록하는 방법이 있습니까?

+1

보통 VS와 gcc가 다를 때 gcc가 맞습니다. –

+0

이것은 Visual C++ 전처리 기의 알려진 버그로, 다시 스캔하기 전에 매크로를 확장하지 않습니다. gcc의 동작이 정확합니다. –

+0

모든 답변을 주셔서 감사합니다 ... 제시된 솔루션의 측면에서 본인은 예제를 너무 단순화하여 작동시키지 못했다고 생각합니다. 다른 해결 방법을 찾았지만이 일반적인 문제에 대한 설명이 아니므로 여기에서 생략하겠습니다. – user109078

답변

1

쉼표는 다른 매크로에서 사용할 때 특별한 처리가 필요합니다.

이 작동합니다 :

#define ONE() 1,2,3 
#define TWO(ARG) doSomething(ARG()); 
#define THR(ARG) TWO(ARG) 

당신은 매크로 자체와 같은 기능으로 돌려 즉시 교체 ONE을 지연.

boost documentation site에서 BOOST_PP_COMMA_IF으로이를 피할 수있는 더 많은 예를 볼 수 있습니다.

#define ONE 1,2,3                                                                
#define TWO_PARENS(arg) doSomething arg;                                                          
#define TWO(arg) TWO_PARENS((arg));                                                           
#define THREE(arg) TWO_PARENS((arg)) 
THREE(ONE)   

이 BTW gcc를

은 사양에 따라 권리입니다 : 그것은 대체 3 개 인수가되지 않도록

3

또 다른 가능성은 인수를 parenthesizing 될 것이다.

관련 문제