2012-10-18 16 views
5

निम्नलिखित कोड दिया:जीसीसी बनाम दृश्य स्टूडियो मैक्रो विस्तार

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

}  

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

    doSomething(1,2,3);  
} 

जीसीसी 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 
} 

मुझे यकीन है कि जो मानक है नहीं कर रहा हूँ, लेकिन मैं इसे दृश्य संवर्धन की तरह काम करना चाहते हैं आईओ काम कर रहा है। क्या कोड को दोबारा करने का कोई तरीका है ताकि यह दोनों कंपाइलरों में इस तरह से काम करे?

+1

आमतौर पर जब वीएस और जीसीसी भिन्न होता है, तो यह सही है। –

+0

यह विज़ुअल सी ++ प्रीप्रोसेसर में एक ज्ञात बग है: यह रीस्कैनिंग से पहले मैक्रोज़ का विस्तार नहीं करता है। जीसीसी का व्यवहार सही है। –

+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 के साथ इसे टालने के अधिक उदाहरण देख सकते हैं।

3

एक और संभावना तर्क parenthesizing किया जाएगा ताकि यह प्रतिस्थापन में 3 तर्क नहीं बन जाता है:

#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 जीसीसी कल्पना के अनुसार सही है।

संबंधित मुद्दे