2016-04-20 13 views
5

मैक्रो से जानकारी का उपयोग कर एक सी ++ # परिभाषित मैक्रो को फिर से परिभाषित करना संभव है? मैंने नीचे दिए गए कोड की कोशिश की, लेकिन मैक्रोज़ का मूल्यांकन करने के तरीके के कारण आउटपुट की अपेक्षा नहीं थी।मैक्रो से जानकारी का उपयोग कर एक सी ++ # परिभाषित मैक्रो को फिर से परिभाषित करने के लिए कैसे?

#include <iostream> 

#define FINAL_DEFINE "ABC" 
#define NEW_DEFINE FINAL_DEFINE "DEF" // Want ABCDEF 

#undef FINAL_DEFINE 
#define FINAL_DEFINE NEW_DEFINE // Want ABCDEF, but get empty? 


int main() 
{ 
    std::cout << FINAL_DEFINE << std::endl; // Want ABCDEF, but doesn't compile. 
} 
+0

मैंने प्रश्न को और स्पष्ट करने के लिए अद्यतन किया। अगर यह अभी भी संदिग्ध है तो मुझे बताएं। – Jeff

+0

असल में: संभव नहीं है, क्योंकि क्रिस डोड के जवाब बताते हैं। एक कामकाज के रूप में आपको इंटरमीडिएट परिभाषित करने के लिए एक अलग नाम का उपयोग करना होगा (पहले 2 लाइनों पर FINAL_DEFINE)। –

उत्तर

0

अपने संकलक push_macro & pop_macro pragma निर्देशों का समर्थन करता है, तो आप ऐसा कर सकते हैं:

#include <iostream> 

#define FINAL_DEFINE "ABC" 
#define NEW_DEFINE FINAL_DEFINE "DEF" 

int main() 
{ 
    std::cout << FINAL_DEFINE << std::endl; // Output ABC 

    #pragma push_macro("FINAL_DEFINE") 
    #define FINAL_DEFINE "XXX" 
    std::cout << NEW_DEFINE << std::endl; // Output XXXDEF 
    #pragma pop_macro("FINAL_DEFINE") 
} 
0

कोड में सभी FINAL_DEFINE preprocessing आखिरी बात से बदल दिया जाएगा के बाद यह परिभाषित और फिर जा रहा कदम संकलित करने के लिए।

तो आप अपने इच्छित मैक्रो को फिर से परिभाषित नहीं कर सकते हैं।

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

+0

कोड कानूनी है। क्या संकलक चेतावनी देगा? –

+0

चेतावनी का मतलब यह नहीं है कि यह इलगल है, मैक्रो फिर से परिभाषित के बारे में चेतावनी आपको बड़ी परियोजना में बहुत मदद करेगी जब कभी-कभी विभिन्न मैक्रोज़ अलग-अलग स्थानों में परिभाषित होते हैं। – Nik

+0

ओपी मैक्रो को परिभाषित करता है, इसलिए कोई पुनर्वितरण नहीं है ... – Jarod42

1

मैक्रो निकायों में मैक्रोज़ कभी मैक्रो परिभाषित होने पर विस्तारित होता है - केवल जब मैक्रो का उपयोग किया जाता है। इसका मतलब है कि NEW_DEFINE की परिभाषा "ABC" "DEF" है, यह #define लाइन: FINAL_DEFINE "DEF" पर बिल्कुल दिखाई देती है।

तो जब आप FINAL_DEFINE का उपयोग करते हैं, तो इसे NEW_DEFINE तक बढ़ाया जाता है जो तब FINAL_DEFINE "DEF" तक बढ़ाया जाता है। इस बिंदु पर यह FINAL_DEFINE का विस्तार नहीं करेगा (क्योंकि इससे अनंत लूप का कारण बन जाएगा) इसलिए कोई और विस्तार नहीं होता है।

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