2012-12-12 22 views
9

में तर्कों को विभाजित करना कुछ विरासत कोड जिन पर मैं काम कर रहा हूं, एक मैक्रो है जो एक अल्पविराम से अलग सूची देता है जिसका उद्देश्य फ़ंक्शन तर्क के रूप में उपयोग किया जाता है। यह बदसूरत है, लेकिन कॉन्फ़िगरेशन फ़ाइल में इनमें से कई शामिल हैं और अब इसे बदलना मुश्किल होगा।सी ++ प्रीप्रोसेसर

#define XY1 0,0 
#define XY2 1,7 
... 

void fun_point(x,y); 

fun_point(XY1); 

यह तब तक ठीक काम करता है जब तक यह एक कार्य कहलाता है। हालांकि, जब पैरामीटर के साथ एक और मैक्रो कॉल करने के लिए कोशिश कर रहा है, पूरी स्ट्रिंग विभाजन के बजाय एक तर्क अल्पविराम में के रूप में दो तर्क

#define MAC_POINT(x,y) (x+y) 
MAC_POINT(XY1) #not expanded by preprocessor 

वहाँ XY परिभाषाओं को बदले बिना इस समस्या के लिए एक समाधान है में माना जाता है?

+2

/मुझे विरासत कोड – icabod

+1

पर मुट्ठी हिलाता है मुझे जीसीसी मैनुअल में कोई चर्चा या यह समस्या मिली: http://gcc.gnu.org/onlinedocs/cpp/Argument-Prescan.html#Argument-Prescan – Quantum7

उत्तर

13

किंडा। निम्नलिखित काम करता है:

#define MAC_POINT(x,y) (x+y) 
#define MAC_POINT1(xy) MAC_POINT(xy) 
#define XY x,y 
MAC_POINT(x,y) 
MAC_POINT1(XY) 

हालांकि, अगर आप MAC_POINT1 को MAC_POINT से बदलने के लिए यदि आप केवल एक तर्क है।

एक और संभावना यह है:

#define MAC_POINT(x,y) (x+y) 
#define MAC_POINT1(xy) MAC_POINT xy 
#define XY x,y 
MAC_POINT1((x,y)) 
MAC_POINT1((XY)) 

अब आप मैक्रो करने के लिए अपने सभी कॉल्स को बदलने के लिए है, लेकिन कम से कम वे लगातार कर रहे हैं।

+0

आह, मैं मुझे लगता है कि मैं देखता हूं कि अतिरिक्त स्तर की संकेत की आवश्यकता क्यों है। धन्यवाद! – Quantum7

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