2013-01-04 15 views
12

इसे qt documentation में ढूंढें। क्या जहाँ तक मैं समझता हूँ बाद भी झूठी हो सकता है अगर फू अपरिभाषित है"#if Foo - 0 == 0" और "#if परिभाषित (Foo) और& Foo == 0" के बीच क्या अंतर है?

#if defined(Foo) && Foo == 0 

और

#if Foo - 0 == 0 

के बीच का अंतर है? मैं इसके बारे में कहां पढ़ सकता हूं?

उत्तर

20

तो Foo अपरिभाषित है, तो बाद के

#if 0 - 0 == 0 

जो सच, झूठी नहीं है करने के लिए अनुवाद कर देगा। याद रखें कि #if के तहत सभी अपरिभाषित पहचानकर्ताओं को शाब्दिक 0 के साथ प्रतिस्थापित किया गया है (एक बार सभी defined() ऑपरेटर का मूल्यांकन किया जाता है)। यह भाषा कीवर्ड से मेल खाने वाले प्रीकोकैसिंग टोकन तक भी लागू होता है। सी भाषा में सभी कीवर्ड इस संदर्भ में 0 के साथ प्रतिस्थापित किए गए हैं। सी ++ कीवर्ड में true और false प्रतिस्थापन से मुक्त हैं, जबकि अन्य सभी कीवर्ड बदल दिए गए हैं।

(btw, कि इसका मतलब है कि सी में true चुपचाप साथ 0 अगर <stdbool.h> शामिल नहीं है प्रतिस्थापित किया जाएगा, और साथ 1 अगर <stdbool.h> शामिल है।)

इस बीच

#if defined(Foo) && Foo == 0 

गलत है जब Foo अपरिभाषित है तो, आपका अंतर यहाँ है।

क्यूटी दस्तावेज वास्तव में यह सुझाव देता है कि पूर्व उत्तरार्द्ध जैसा ही है। मुझे नहीं पता कि वे ऐसा क्यों करते हैं, क्योंकि वे निश्चित रूप से समकक्ष नहीं हैं। यह क्यूटी दस्तावेज़ों में एक त्रुटि प्रतीत होता है।

#define Foo 0 

और नहीं किया जा सकता:

#define Foo // Foo == 0 would give an error, cannot evaluate Foo 

जबकि - फू == 0 और फू के बीच

+0

तो क्यूटी दस्तावेज़ों में एक गलती है!'उनके स्पष्टीकरण से यह पता चला है कि उन दोनों के बराबर – Hate

+5

+1 है, सभी अपरिभाषित पहचानकर्ताओं को शाब्दिक 0' – billz

+0

@ बिल्ज़ और एंड्रीटी के साथ प्रतिस्थापित किया गया है, क्या आप सी ++ में मैक्रोज़ के बारे में कुछ लिंक या सलाह लेख साझा कर सकते हैं? क्योंकि उनके बारे में जो मैंने पाया है वह सिर्फ उनकी सूची और संक्षिप्त विवरण है, लेकिन मैंने निश्चित रूप से कहीं भी नहीं पढ़ा जैसे "सभी अपरिभाषित पहचानकर्ताओं को शाब्दिक 0 के साथ बदल दिया गया है"। – Hate

1

अंतर 0 == 0 कि पूर्व में, फू एक मूल्य के साथ परिभाषित किया जाना चाहिए है

#if defined(Foo) && Foo == 0 
: - के फू मामले में 0 == 0, फू एक मूल्य

तो बिना परिभाषित किया जा सकता

मतलब फू परिभाषित किया गया है और इसका मूल्य (इस मामले में 0 का) है।

और:

#if Foo - 0 == 0 

मतलब फू या तो पहले मामले में की तरह 0 के साथ परिभाषित या एक मूल्य के बिना परिभाषित किया गया है, लेकिन चूंकि यह परिभाषित (फू) नहीं है, फू रूप में अच्छी तरह से लागू होगा अपरिभाषित ।

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