2012-03-30 12 views
16

एक समीक्षा के दौरान मैं निम्नलिखित की तरह कोड का एक टुकड़ा भर में आया था? क्या स्थिति ठीक से निष्पादित होगी?#if परिभाषित (x) || (वाई); क्या यह मान्य है?</p> <pre><code>#if defined(x) || y </code></pre> <p>उपरोक्त कथन का क्या मतलब है:

+0

* निष्पादन * सही शब्द नहीं है। वह कोड संकलन समय पर preprocessed है। मुझे वाक्यविन्यास की शुद्धता के बारे में निश्चित नहीं है, लेकिन यह अधिकतर * मूल्यांकन * प्राप्त हो सकता है लेकिन आमतौर पर "#if परिभाषित (x)" का सही वाक्यविन्यास "#IFDEF x" –

उत्तर

20

हाँ यह मान्य है।

यहाँ है मानक (C99) 6.10p1 में क्या कहते हैं:

if-group: 
# if constant-expression new-line groupopt 
# ifdef identifier new-line groupopt 
# ifndef identifier new-line groupopt 

defined ऑपरेटर एक निरंतर अभिव्यक्ति (6.10.1p1) की एकल ऑपरेटर हिस्से के रूप में देखा जाता है।

अपने उदाहरण में, हालत सच के रूप में मूल्यांकन किया जाता है, तो मैक्रो x परिभाषित किया गया है या अगर y से 0

3

हां, चूंकि defined(x) एक बूलियन है और सत्य या गलत लौटाता है।

उपरोक्त कथन का अर्थ है "या तो x परिभाषित किया गया है या y सत्य है"।

+5

... या दोनों है। :) – phimuemue

10

परिभाषित और अलग है इस के लिए तर्क दुगना है।

बजाय एक #ifdef का उपयोग करने का

, आप, defined ऑपरेटर का उपयोग ताकि आप इसे (&&, ||, आदि) पर तार्किक ऑपरेटरों का उपयोग कर सकते हैं, ताकि आप अपने कोड नकल करने इतना है कि यह ठीक से शामिल किया गया है की जरूरत नहीं है यदि आपको परिभाषित करने की आवश्यकता के लिए कई मानदंड हैं।

इसके अलावा, मेरी राय में, मैं इसे बहुत आसान #ifdef x से #if defined(x) के रूप में पढ़ने के लिए मिल जाए, और जबकि कि #ifdef साथ संभव नहीं है तो आपको निम्न #if defined(x) && defined(y) कर सकता है,।

1

यह सही है लेकिन यह एक बुरा अभ्यास है। एक सशर्त में दो अलग-अलग मूल्यांकन ('वाई' और 'परिभाषित (एक्स)' का उपयोग क्यों करें। यह दूसरों के लिए भ्रमित हो सकता है। नीचे दिया गया उदाहरण || का अधिक सामान्य उपयोग दिखाता है और #defined मैक्रो के खिलाफ & & operatiors:

#define AA 1 
#define BB 2 
#if (defined AA) || (defined BB) 
    #warning "A or B" 
#endif 
#if (defined AA) && (defined BB) 
    #warning "A and B" 
#endif 

जब ऊपर कोड चलाया गया था उपयोगकर्ता स्क्रीन पर इन संदेशों को मिलेगा:

#warning "A or B" 
#warning "A and B" 

लेकिन कोड (एए अपरिभाषित था) इस तरह था, तो:

#undefine AA 
#define BB 2 
#if (defined AA) || (defined BB) 
    #warning "A or B" 
#endif 
#if (defined AA) && (defined BB) 
    #warning "A and B" 
#endif 

तो उपयोगकर्ता यह संदेश प्राप्त होगा:

#warning "A or B" 
+0

ध्यान दें कि आपके द्वारा यहां उपयोग किया गया वाक्यविन्यास अलग है: "परिभाषित एक्स" के बजाय "परिभाषित एक्स"। दोनों एक ही परिणाम पैदा करते हैं। – StarShine

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