#if और # अल्पाइन MY_MACRO (0)
#If का उपयोग करने का अर्थ है कि आपने "परिभाषित" मैक्रो बनाया है, अर्थात, कुछ ऐसा जिसे कोड में खोजा जाएगा "(0)" द्वारा प्रतिस्थापित किया जाएगा। यह "मैक्रो नरक" है मुझे C ++ में देखने से नफरत है, क्योंकि यह संभावित कोड संशोधनों के साथ कोड को प्रदूषित करता है।
उदाहरण के लिए:
#define MY_MACRO (0)
int doSomething(int p_iValue)
{
return p_iValue + 1 ;
}
int main(int argc, char **argv)
{
int MY_MACRO = 25 ;
doSomething(MY_MACRO) ;
return 0;
}
जी ++ पर निम्नलिखित त्रुटि देता है:
main.cpp|408|error: lvalue required as left operand of assignment|
||=== Build finished: 1 errors, 0 warnings ===|
केवल एक त्रुटि।
जिसका अर्थ है कि आपके मैक्रो ने आपके C ++ कोड के साथ सफलतापूर्वक बातचीत की: फ़ंक्शन को कॉल सफल रहा। इस सरल मामले में, यह मनोरंजक है। लेकिन अपने कोड के साथ चुपचाप खेलने वाले मैक्रों के साथ मेरा खुद का अनुभव खुशी और फुलफिलमेंट से भरा नहीं है, इसलिए ...
#ifdef और #define MY_MACRO
#Ifdef का उपयोग करने का अर्थ है कि आप कुछ "परिभाषित" करते हैं। ऐसा नहीं है कि आप इसे एक मूल्य देते हैं। यह अभी भी प्रदूषित है, लेकिन कम से कम, यह "कुछ भी नहीं" द्वारा प्रतिस्थापित किया जाएगा, और सी + + कोड द्वारा लैगिट कोड स्टेटमेंट के रूप में नहीं देखा जाएगा। ऊपर एक ही कोड, एक साधारण परिभाषित के साथ, यह:
#define MY_MACRO
int doSomething(int p_iValue)
{
return p_iValue + 1 ;
}
int main(int argc, char **argv)
{
int MY_MACRO = 25 ;
doSomething(MY_MACRO) ;
return 0;
}
निम्नलिखित चेतावनियाँ देता है:
main.cpp||In function ‘int main(int, char**)’:|
main.cpp|406|error: expected unqualified-id before ‘=’ token|
main.cpp|399|error: too few arguments to function ‘int doSomething(int)’|
main.cpp|407|error: at this point in file|
||=== Build finished: 3 errors, 0 warnings ===|
इसलिए...
निष्कर्ष
मैं अपने कोड में मैक्रोज़ के बिना रहूंगा, लेकिन कई कारणों से (हेडर गार्ड या डिबग मैक्रोज़ को परिभाषित करते हुए), मैं नहीं कर सकता।
लेकिन कम से कम, मैं अपने वैध सी ++ कोड के साथ उन्हें कम से कम इंटरैक्टिव संभव बनाना पसंद करता हूं। जिसका अर्थ है बिना मूल्य के #define का उपयोग करना, #ifdef और #ifndef का उपयोग करना (या जिम बक द्वारा सुझाए गए # भी), और सबसे बढ़कर, उन्हें उनके इतने लंबे और इतने एलियन नाम देना उनके सही दिमाग का उपयोग नहीं करेगा यह "संयोग से" है, और यह किसी भी तरह से वैध सी ++ कोड को प्रभावित नहीं करेगा।
स्क्रिप्टम के बाद
अब, जैसा कि मैं अपनी पोस्ट को फिर से पढ़ रहा हूं, मुझे आश्चर्य है कि क्या मुझे कुछ मूल्य खोजने की कोशिश नहीं करनी चाहिए जो मेरे परिभाषित में जोड़ने के लिए कभी भी C ++ सही नहीं होंगे। कुछ इस तरह
#define MY_MACRO @@@@@@@@@@@@@@@@@@
जो #ifdef और #ifndef के साथ उपयोग किया जा सकता है, लेकिन किसी फ़ंक्शन के अंदर उपयोग किए जाने पर कोड संकलित नहीं होने दें ... मैंने इसे g ++ पर सफलतापूर्वक आज़माया, और इसने त्रुटि दी:
main.cpp|410|error: stray ‘@’ in program|
दिलचस्प। :-)
#if
, आप भी इसके#elif
विपरीत, एक सुसंगत तरीके से उपयोग कर सकते हैं#ifdef
। इस प्रकार, केवल उपयोग करने के बजाय , आदि के साथ#define BLAH
उपयोग करें ...#define BLAH 1
#if BLAH