2012-02-14 19 views
11

मैं वर्तमान में एक पहले से ही विकसित MFC C++ लिखा परियोजना पर काम कर रहा हूँ और परिभाषा होने एक पहले से ही मौजूद मैक्रो के साथ एक समस्या का सामना करना पड़ रहा हूँ:पुनः परिभाषित करना या बदलते मैक्रो मान

#define HEIGHT_TESTS 13 

मैं से मान बदलने के लिए कोशिश कर रहा हूँ कोड के भीतर लेकिन मुझे लगता है कि इसकी पूर्व-परिभाषित परिभाषा के बाद से, मैं ऐसा करने में असमर्थ हूं। मूल मैक्रो समग्र रूप से बदलने के बिना मैं इस समस्या को हल कर सकता हूं (क्योंकि यह प्रोग्राम की मूल कार्यक्षमता को प्रभावित कर सकता है)। मैं बस इसे एक विशेष स्थिति में बदलने का इरादा रख रहा हूं, बाकी सब कुछ बाकी है।

बस सभी को यह बताने के लिए, मैंने स्पष्ट रूप से मूल्य (17) के साथ एक अलग मैक्रो परिभाषा का उपयोग करने का प्रयास किया है, जिसका उपयोग करने का इरादा है, लेकिन इस तरह कोई भाग्य नहीं है।

किसी भी मदद की बहुत सराहना की जाएगी।

+0

मैं #undefining और इसे फिर से परिभाषित करने के बजाय, आपके उद्देश्य के लिए एक और मैक्रो रखने की अनुशंसा करता हूं। – Ajay

+0

ध्यान दें कि यदि आप पुनर्स्थापित करने की आवश्यकता है, तो आप मौजूदा मान को सहेजने और इसे पुनर्स्थापित करने में सक्षम नहीं होंगे। आपके लिए एकमात्र तरीका 13 के साथ मैक्रो को फिर से परिभाषित करना होगा जो स्पष्ट रूप से एक कठिन कोडित मूल्य है। उत्तर के लिए, आपके पास पहले से 2 नीचे हैं जो सही हैं। –

+0

मैंने एक अलग मैक्रो का उपयोग करने का प्रयास किया, लेकिन यह काम नहीं कर सका। कार्यक्रम दुर्घटनाग्रस्त हो गया। यह केवल तभी होता है जब मैं इस विशेष # परिभाषित मूल्य को बदलता हूं, यह मुझे एक उचित परिणाम देता है (परिणाम न कि मैं इस विशेष स्थिति के साथ आने का इरादा रखता हूं)। – Neophile

उत्तर

25

आप undef कर सकते हैं यह ऑफ़लाइन और define फिर से:

#include <iostream> 

#define AAA 13 

int main() 
{ 
    #undef AAA 
    #define AAA 7 
    std::cout << AAA; 
} 

आउटपुट: 7

कृपया ध्यान दें कि बयान है कि # के साथ शुरू कर रहे हैं प्रीप्रोसेसर निर्देश जो कोड को संकलित करने से पहले भी ख्याल रखा जाता है। इस मामले में, यह निरंतर AAA को केवल 7 द्वारा प्रतिस्थापित किया जाएगा, यानी यह सिंटैक्स, कोई प्रकार की सुरक्षा आदि के अतिरिक्त चेक के साथ टेक्स्टुअल प्रतिस्थापन की तरह काम करता है ...

... जो मुख्य कारण है कि आपको मैक्रो और #define रों जहां वे स्थिर कार्यों और चर :)


क्यों "शाब्दिक प्रतिस्थापन" द्वारा प्रतिस्थापित किया जा सकता का उपयोग कर से बचने के?इस कोड में

देखो:

  • आह, #define AAA 13, इसलिए जब मैं AAA अगले मारा:

    #include <iostream> 
    
    #define AAA 13 
    
    void purePrint() { 
        std::cout << AAA; 
    } 
    
    void redefAndPrint() { 
        #undef AAA 
        #define AAA 7 
        std::cout << AAA; 
    } 
    
    int main() 
    { 
        #undef AAA 
        #define AAA 4 
        purePrint(); 
        redefAndPrint(); 
        purePrint(); 
    } 
    

    पूर्वप्रक्रमक यह कर, ऊपर से नीचे तक लाइन द्वारा लाइन चला जाता है समय, मैं वहां रखूंगा 13

  • देखो, शुद्धप्रिंट AAA का उपयोग करता है, मैं आर हूँ साथ 13
  • प्रतीक्षा यह eplacing, अब वे मुझे बताओ 7 उपयोग करने के लिए, तो मैं redefAndPrint() में इसलिए यहाँ 13
  • का उपयोग कर बंद कर देंगे मैं वहाँ बदलने डाल देता हूँ 7

इस कोड में दिए गए कोड:

#include <iostream> 

void purePrint() { 
    std::cout << 13; 
} 

void redefAndPrint() { 
    std::cout << 7; 
} 

int main() 
{ 
    purePrint(); 
    redefAndPrint(); 
    purePrint(); 
} 

जोआउटपुट करेगाऔर नवीनतम #define AAA 4 बिल्कुल उपयोग नहीं किया जाएगा।

+0

तो, हम प्रोग्राम में कहीं भी '# undef' और' # परिभाषित 'का उपयोग कर सकते हैं? – Neophile

+1

@ Nerds.Dont.Swear: हाँ। और जब आप '#undef एएए' कहते हैं, तो आपको चिंता करने की भी आवश्यकता नहीं है कि 'एएए' पहले परिभाषित किया गया था या नहीं। – LihO

+0

आपका मतलब परिभाषित * :) – Neophile

4

कुछ निम्नलिखित की तरह:

#undef HEIGHT_TESTS 
#define HEIGHT_TESTS 17 

// Use redefined macro 

// Restore 
#undef HEIGHT_TESTS 
#define HEIGHT_TESTS 13 
संबंधित मुद्दे