2010-09-19 8 views
63
#define one 0 
#ifdef one 
printf("one is defined "); 
#ifndef one 
printf("one is not defined "); 

की भूमिका इस में क्या #ifdef और #ifndef की भूमिका है, और उत्पादन क्या है? एक ifdef/endif या ifndef/endifजोड़ी अंदर#ifdef और #ifndef

उत्तर

96

पाठ में छोड़ दिया या पूर्व प्रोसेसर स्थिति के आधार पर से हटा दिया जाएगा। ifdef का अर्थ है "यदि निम्नलिखित परिभाषित किया गया है" जबकि ifndef का अर्थ है "यदि निम्नलिखित परिभाषित नहीं है"।

तो: तो ifdef सच है और ifndef गलत है

printf("one is defined "); 

one के बाद से परिभाषित किया गया है:

#define one 0 
#ifdef one 
    printf("one is defined "); 
#endif 
#ifndef one 
    printf("one is not defined "); 
#endif 

के बराबर है। इससे कोई फर्क नहीं पड़ता कि इसे के रूप में परिभाषित किया गया है। ऐसा ही एक (मेरी राय में बेहतर) है कि करने के लिए कोड का टुकड़ा होगा:

#define one 0 
#ifdef one 
    printf("one is defined "); 
#else 
    printf("one is not defined "); 
#endif 

के बाद से है कि इरादे निर्दिष्ट करता है और अधिक स्पष्ट रूप से इस विशेष स्थिति में।

आपके विशेष मामले में, ifdef के बाद पाठ one के बाद से हटाया नहीं गया है। ifndefके बाद पाठ उसी कारण से हटा दिया गया है। वहाँ कुछ बिंदु पर दो बंद करने endif लाइनों होने की आवश्यकता होगी और इस प्रकार पहले, लाइनों फिर से शामिल किया जा रहा शुरू करने के लिए कारण होगा:

 #define one 0 
+--- #ifdef one 
| printf("one is defined ");  // Everything in here is included. 
| +- #ifndef one 
| | printf("one is not defined "); // Everything in here is excluded. 
| | : 
| +- #endif 
| :        // Everything in here is included again. 
+--- #endif 
48

किसी प्रश्न में एक छोटे से जाल है कि वहाँ का उल्लेख करना चाहिए। #ifdef केवल तभी जांच करेगा यदि निम्न प्रतीक #define या कमांड लाइन के माध्यम से परिभाषित किया गया है, लेकिन इसका मूल्य (वास्तव में इसकी प्रतिस्थापन) अप्रासंगिक है। आप

#define one 

प्रीकंपलर भी स्वीकार कर सकते हैं। लेकिन यदि आप #if का उपयोग करते हैं तो यह एक और बात है।

#define one 0 
#if one 
    printf("one evaluates to a truth "); 
#endif 
#if !one 
    printf("one does not evaluate to truth "); 
#endif 

one does not evaluate to truth देगा। कीवर्ड defined वांछित व्यवहार प्राप्त करने की अनुमति देता है।

#if defined(one) 

इसलिए #ifdef

#if निर्माण का लाभ कोड रास्तों में से एक बेहतर हैंडलिंग अनुमति देने के लिए है के बराबर है, पुराने #ifdef/#ifndef जोड़ी के साथ ऐसा ही कुछ करने की कोशिश।

#if defined(ORA_PROC) || defined(__GNUC) && __GNUC_VERSION > 300 
0

"एक #if" मतलब है कि अगर "#define एक" "एक #if" लिखा गया है अन्यथा निष्पादित किया जाता है "#ifndef एक" निष्पादित किया जाता है।

यह केवल सी प्री-प्रोसेसर (सीपीपी) निर्देश है, यदि सी भाषा में शाखा विवरणों के बराबर है।

यानी यदि {#define one} तो printf ("एक सत्य का मूल्यांकन करता है"); अन्य printf ("एक परिभाषित नहीं किया गया है"); इसलिए यदि कोई # डिफाईन स्टेटमेंट नहीं था तो कथन की दूसरी शाखा निष्पादित की जाएगी।

+3

मुझे यकीन नहीं है कि यह क्या जोड़ता है कि अन्य उत्तरों पहले से कवर नहीं हैं, और आपका उदाहरण सी या सी ++ नहीं है। – SirGuy

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