2014-07-10 7 views
2

이의이Stringize __VA_ARGS__ (C++ 가변 인자 매크로)

class Item{ 
public: 
    Item(int id,const char *name,const char *props=NULL); 
}; 

보자 내가 쓰고 싶은 : 매크로

#define ITEM(ID,NAME,...) new Item(ID,NAME, #__VA_ARGS__) 

ITEM(1,FIRST); 
ITEM(2,SECOND, WithSomeProps); 

#__VA_ARGS__ gcc가 잘 컴파일하지만 준다 VStudio에서 오류가 발생했습니다. 견고하고 휴대 가능한 솔루션이 있습니까?

ITEM의 #definitions를 여러 번 사용하여 .h 파일에 ITEM() 콜렉션을 갖고 싶습니다.

+1

왜이 방법을 사용 하시겠습니까? 아이템 (ID, NAME, OTHER_ARGS)'? –

+7

왜 이것을 필요로합니까? 생성자의 세 번째 입력 인수가 기본값이므로 'Item (1, FIRST)'및 (Item, 2, SECOND, WithSomeProps)를 호출 할 수 있습니다. – 101010

+2

왜 매크로 뒤에 야생의'new'가 숨겨져 있습니까? – Shoe

답변

0

GCC와 Visual Studio는 Variadic 매크로를 다르게 처리합니다. 매크로는 컴파일러 전 처리기를 기반으로하기 때문에 (전처리 시간에 확장됩니다).

차이점 중 하나는 빈 가변 매크로를 처리하는 방법 중 하나입니다. __VA_ARGS__ 중 하나가 비어있는 경우 다른 하나는 컴파일러 오류가 발생하지만 __VA_ARGS__은 비어 있습니다.

예제에서 첫 번째 줄인 ITEM(1,FIRST)은 컴파일시 오류를 발생시키고 다른 쪽에서는 잘 작동합니다.

Item(int id,const char *name,void *allwaysNull, const char *props=NULL); 

그리고 무엇 이상해이

ITEM(1,0,FIRST) 
ITEM(2,0,SECOND,WithSomeProps) 

처럼 매크로 initialziations 있습니다 생성자 뭔가처럼 있도록 이에 대한

한 가지 해결 방법은 빈 첫 번째 인수를하는 것입니다 내 경험에 비추어 볼 때, GCC는 빈 변수에 문제가있는 것입니다. VA_ARGS 가변 매크로 ...

+0

** VA_AGS **는 실수입니까? – ikh

+0

YES :) .. thanks, fixed – MichaelCMS

+0

안녕하세요 @MIchaelCMS 시도하지는 않았지만 귀하의 IDA가 누락 된 emtpy 인수로 문제를 극복 할 것으로 보이지만 내가 볼 수없는 것은 이것이 VA_ARGS를 문자열 화하는 데 어떻게 도움이되는지입니다 – Joan