2013-02-25 3 views
0

여러 매크로가있는 라이브러리가 있는데, AIX에서 제대로 컴파일되지만 이제는 동일한 코드를 컴파일해야하며 매크로가 작동하지 않는 것 같습니다. 나는 메시지를 수신 유지 :매크로에서 매크로 컴파일이 중지되었습니다.

error: pasting "::" and "EVENT_DATA" does not give a valid preprocessing token. 

AIX에서와 같이 리눅스 행위에 C++ 프리 프로세서를 만들 수있는 방법이있다. 저는 리눅스에서 g ++를, AIX에서는 xlc_r을 사용하고 있습니다.

다음은 매크로 중 하나입니다.

#define E_TRA_INMOD(MName, Comp) \ 
    static const ES_TracMg::ES_TracComps ES_TracComp = \ 
            ES_TracMg::##Comp; \ 
    static char* ES_Mod_Namp = MName; \ 
    static unsigned long ES_SerMas = \ 
       ES_TracMg::m_MServ[ES_TracMg##Comp]; 

내가 E_TRA_INMOD("Error", EVENT_DATA);
오류 같이 호출하는 것입니다 :

error: pasting "::" and "EVENT_DATA" does not give a valid preprocessing token. 
+0

오류 메시지가 무엇인가요? 또는 당신은 무엇을 얻고 당신은 싫어합니까? –

+0

오류 메시지 : 오류 : 붙여 넣기 "::"및 "EVENT_DATA"가 유효한 전처리 토큰을 제공하지 않습니다. – Lefsler

+0

'cpp'가 전처리를 거부하는 경우가 아니라 – ShPavel

답변

2

난 당신이 여기 ##를 사용하지 않을 생각 :

#define E_TRA_INMOD(MName, Comp) \ 
    static const ES_TracMg::ES_TracComps ES_TracComp = \ 
            ES_TracMg::##Comp; \ 

그것은해야

#define E_TRA_INMOD(MName, Comp) \ 
    static const ES_TracMg::ES_TracComps ES_TracComp = \ 
            ES_TracMg::Comp; \ 

두 토큰을 하나의 토큰에 함께 묶어 두지 않아도됩니다. Comp으로 확장하면됩니다.

0

매크로에서 무엇을하려고합니까? 첫 번째 토큰 붙여 넣기가 중복 된 것처럼 보입니다.

#define E_TRA_INMOD(MName,Comp) \ 
    static const ES_TracMg::ES_TracComps ES_TracComp = \ 
            ES_TracMg::Comp; \ 
    static char* ES_Mod_Namp = MName; \ 
    static unsigned long ES_SerMas = \ 
       ES_TracMg::m_MServ[ES_TracMg##Comp]; 
관련 문제