2010-06-21 8 views
8

मान लीजिए मैं निम्नलिखित मैक्रो है:कैसे अपने पिछले परिभाषा का उपयोग किसी मैक्रो फिर से परिभाषित करने

#define xxx(x) printf("%s\n",x); 
मैं इसके नाम को परिवर्तित किए बिना इस मैक्रो का एक "बढ़ाया" संस्करण का उपयोग करना चाहते हैं कुछ फ़ाइलों में

अब। नया संस्करण मूल संस्करण की कार्यक्षमता की पड़ताल करता है और कुछ और काम करता है।

#define xxx(x) do { xxx(x); yyy(x); } while(0) 

बेशक यह मेरे redefition चेतावनी देता है, लेकिन कारण है कि मैं पाने के 'xxx' इस दायरे में घोषित नहीं किया गया था? मुझे इसे ठीक से कैसे परिभाषित करना चाहिए?

संपादित करें: इस http://gcc.gnu.org/onlinedocs/gcc-3.3.6/cpp/Self_002dReferential-Macros.html के अनुसार यह संभव

+1

कि मैक्रो प्रतिस्थापन के अनंत रिकर्सन को रोकना। इसका मतलब यह नहीं है कि आप एक से अधिक चीज़ों के लिए एक मैक्रो परिभाषित कर सकते हैं। –

उत्तर

3

स्व निर्देशात्मक मैक्रो बिल्कुल काम नहीं है:

http://gcc.gnu.org/onlinedocs/cpp/Self_002dReferential-Macros.html#Self_002dReferential-Macros

आप सी पर काम कर रहे हैं आप टेम्पलेट कार्य करता है और नामस्थान के साथ एक ही परिणाम प्राप्त कर सकते हैं ++:

template <typename T> void xxx(x) { 
     printf("%s\n", x); 
} 

namespace my_namespace { 

template <typename T> void xxx(T x) { 
     ::xxx(x); 
     ::yyy(x); 
} 

} 
0

होना चाहिए यह आप के लिए वास्तव में क्या कह रहे हैं नहीं है बल्कि यह कर सकते हैं।

आप इसे #undef एक नई परिभाषा देने से पहले एक मैक्रो कर सकते हैं।

उदाहरण:

#ifdef xxx 
#undef xxx 
#endif 
#define xxx(x) whatever 

मैं कभी नहीं सुना (या देखा जाता है) एक पुनरावर्ती मैक्रो हालांकि। मुझे नहीं लगता कि यह संभव है।

+2

ध्यान दें कि 'if ifff 'ब्लॉक की आवश्यकता नहीं है। आप इसे मैक्रो के रूप में परिभाषित करने के लिए किसी नाम पर '# undef' का उपयोग कर सकते हैं, भले ही वह नाम वर्तमान में मैक्रो के रूप में परिभाषित न हो। तो, आप बस '#undef xxx' और फिर' # परिभाषित कर सकते हैं ... '। –

+0

@ जेम्स मैकनेलिस: जानना अच्छा है। धन्यवाद! – ereOn

6

संभव नहीं है। मैक्रोज़ अन्य मैक्रोज़ का उपयोग कर सकते हैं लेकिन वे परिभाषा समय पर विस्तारित समय पर उपलब्ध परिभाषा का उपयोग कर रहे हैं। और सी और सी ++ में मैक्रोज़ रिकर्सिव नहीं हो सकते हैं, इसलिए आपके नए मैक्रो में xxx का विस्तार नहीं किया गया है और इसे फ़ंक्शन के रूप में माना जाता है।

3

आप मैक्रो की पुरानी परिभाषा का पुन: उपयोग नहीं कर पाएंगे, लेकिन आप इसे परिभाषित कर सकते हैं और नई परिभाषा बना सकते हैं। उम्मीद है कि कॉपी और पेस्ट करने के लिए यह बहुत जटिल नहीं है।

#ifdef xxx 
#undef xxx 
#endif 
#define xxx(x) printf("%s\n",x); 

मेरी सिफारिश xxx2 मैक्रो को परिभाषित कर रही है।

#define xxx2(x) do { xxx(x); yyy(x); } while(0); 
+3

ध्यान दें कि 'if ifff 'ब्लॉक की आवश्यकता नहीं है। आप इसे मैक्रो के रूप में परिभाषित करने के लिए किसी नाम पर '# undef' का उपयोग कर सकते हैं, भले ही वह नाम वर्तमान में मैक्रो के रूप में परिभाषित न हो। तो, आप बस '#undef xxx' और फिर' # परिभाषित कर सकते हैं ... '। –

+0

कूल! इसके बारे में नहीं पता था। 'If ​​ifff' को छोड़कर कोड को और अधिक पठनीय बनाता है। – Mike

+0

मेरे पास एक प्रोजेक्ट-प्रीफिक्स.pch है जहां मैंने डिफ़ॉल्ट रूप से सेट किया है जो मेरे ऐप्स के ऐप के लिए आम हैं और फिर ऐप विशिष्ट Prefix.pch की चीजों को बदलने के लिए है। जब मैंने एक मैक्रो को फिर से परिभाषित किया और प्री-प्रोसेसर में उस चेतावनी को बंद करने का तरीका नहीं पता था, तो मुझे 'लेक्सिकल या प्रीप्रोसेसर इश्यू मैक्रो फिर से परिभाषित' चेतावनी मिल रही थी। #undef PLAY_BUTTON_TITLE और फिर #Dfine PLAY_BUTTON_TITLE @ "प्रारंभ करें" त्रुटि को दबाता है और बटन को फिर से परिभाषित करता है। – JScarry

2

यदि हम 'xxx' मैक्रो में 'x' पैरामीटर के प्रकार को जानते हैं, तो हम इसे फ़ंक्शन में उपयोग करके मैक्रो को फिर से परिभाषित कर सकते हैं और फिर 'xxx' मैक्रो को इस फ़ंक्शन के रूप में परिभाषित कर सकते हैं

'xxx' मैक्रो के लिए मूल परिभाषा:

#define xxx(x) printf("xxx %s\n",x); 

'xxx' मैक्रो की एक निश्चित फ़ाइल बनाने बढ़ाया संस्करण में: स्वयं निर्देशात्मक मैक्रो पेज नियमों का वर्णन है

/* before redefining the "xxx" macro use it in function 
* that will have enhanced version for "xxx" 
*/ 
static inline void __body_xxx(const char *x) 
{ 
    xxx(x); 
    printf("enhanced version\n"); 
} 

#undef xxx 
#define xxx(x) __body_xxx(x) 
संबंधित मुद्दे