Ifdef में बूलियन: "#ifdef A && B" "#if परिभाषित (A) && परिभाषित (B)" के समान है?


83

C ++ में, क्या यह है:

#ifdef A && B

बराबर:

#if defined(A) && defined(B)

?

मैं सोच रहा था कि यह नहीं था, लेकिन मैं अपने संकलक (VS2005) के साथ अंतर नहीं पा सका हूं।


1
संभव डुप्लिकेट: stackoverflow.com/questions/965700/… मैं देखता हूं कि वे C और C ++ हैं, लेकिन प्रीप्रोसेसर मूल रूप से समान हैं: stackoverflow.com/questions/5085533/…
Ciro Santii 冠状 over over 法轮功 法轮功

क्या कोई यह तय करने के लिए मानक की बोली और व्याख्या करेगा कि क्या यह कानूनी है या नहीं (यह सुनिश्चित करने के लिए काम नहीं करना चाहिए, लेकिन क्या यह संकलन करना चाहिए)? मैं "16 प्रीप्रोसेसिंग निर्देशों" को पढ़ने के 15 मिनट के बाद असमर्थ हूं।
सिरो सेंटिल्ली 郝海东 冠状 iro i ''

जवाबों:


92

वे एक जैसे नहीं हैं। पहला काम नहीं करता है (मैंने 4.4.1 gcc में परीक्षण किया है)। त्रुटि संदेश था:

test.cc:1:15: चेतावनी: #ifdef निर्देश के अंत में अतिरिक्त टोकन

यदि आप जांचना चाहते हैं कि क्या कई चीजें परिभाषित हैं, तो दूसरे का उपयोग करें।


जाँच के लिए धन्यवाद। मैं Microsoft के कंपाइलर का उपयोग कर रहा हूं और यह इसे अनुमति देता है, लेकिन यह मुझे सही नहीं लगा।
criddell

2
आप कुछ एकल संकलक का उपयोग करके चीजों को साबित नहीं कर सकते। मानक का संदर्भ लें, जो बताता है कि यह अमान्य है।
ऑर्बिट

@LightnessRacesinOrbit हालांकि, कुछ संकलक मानक का विस्तार करते हैं। "यह एक निश्चित संकलक में काम करता है" कहना यह साबित करने का प्रयास नहीं है कि यह वैध है; यह ध्यान देने योग्य है कि एक निश्चित संकलक एक निश्चित तरीके से मानक का विस्तार करता है।
निधि मोनिका का मुकदमा

@QPaysTaxes: सहमत, लेकिन यह जवाब ऐसा नहीं करता है। यह एक सवाल का जवाब देता है जो "सी ++ में शुरू होता है ...." सी ++ के बारे में एक सामान्य तथ्य प्रतीत होता है। पहली नज़र में, इवान ने एक संकलक के साथ अपने सिद्धांत का परीक्षण किया और फिर यह मान लिया कि यह सभी के लिए सच है, भाषा की गारंटी से ही। अगर उसने यह निर्धारित किया कि यह व्यवहार एक GCC एक्सटेंशन है और उसने कहा "यह GCC एक्सटेंशन है" (संदर्भ सामग्री के लिंक के साथ) तो यह ठीक होगा! (वास्तव में इस विशेष प्रश्न का उत्तर नहीं)
लाइटनेस रेस इन ऑर्बिट

1
हालांकि कोई भी सकारात्मक परीक्षण "साबित" नहीं कर सकता है कि यह वैध है, एक भी नकारात्मक यह साबित करने के लिए पर्याप्त है कि यह नहीं है, या यह कि कम से कम उपयोग करने की सलाह नहीं दी जाती है। जबकि मानक का उल्लेख करना अच्छा होगा, यह साबित करते हुए कि यह कम से कम एक प्रमुख संकलक में काम नहीं करता है, इस चर्चा के प्रयोजनों के लिए "यह काम नहीं करता" कहने के लिए पर्याप्त सबूत हैं।
zeel

48

सशर्त संकलन

आप पूर्वप्रोसेसर लाइन के भीतर 0 या 1 का मूल्यांकन करने वाले अभिव्यक्तियों का उपयोग करने के लिए #if निर्देश में परिभाषित ऑपरेटर का उपयोग कर सकते हैं। यह आपको नेस्टेड प्रीप्रोसेसिंग निर्देशों का उपयोग करने से बचाता है। पहचानकर्ता के चारों ओर कोष्ठक वैकल्पिक हैं। उदाहरण के लिए:

#if defined (MAX) && ! defined (MIN)  

परिभाषित ऑपरेटर का उपयोग किए बिना, आपको उपरोक्त उदाहरण देने के लिए निम्नलिखित दो निर्देशों को शामिल करना होगा:

#ifdef max 
#ifndef min

2
जबकि आप जो कहते हैं वह सही है, यह सवाल का जवाब नहीं देता है, उन्होंने पूछा कि क्या दोनों एक ही हैं ... वे नहीं हैं।
इवान टेरान

1
मुझे लगता है कि यह कहता है "वे समान नहीं हैं", आप देख सकते हैं कि यह बताता है कि कैसे #if परिभाषित (COND_A) && परिभाषित (COND_B) के बराबर है जो #ifdef COND_A && COND_B से अलग है
स्वेतलोगर एंजेलोव

किसी भी तरह से, यह एक उपयोगी नोट है।
पॉल मसरी-स्टोन

2

निम्नलिखित परिणाम समान हैं:

1।

#define A
#define B
#if(defined A && defined B)
printf("define test");
#endif

2।

#ifdef A
#ifdef B
printf("define test");
#endif
#endif

1
क्या आप यह बताने के लिए कुछ टिप्पणी जोड़ सकते हैं कि यह प्रश्न का उत्तर कैसे देता है, यह आपके उत्तर से स्पष्ट नहीं है।
जेम्स वुड

यह उत्तर, जबकि तकनीकी रूप से सही है, सवाल का सही उत्तर नहीं देता है, और इसका अर्थ गलत उपयोग है। जबकि दो ब्लॉक एक ही काम करेंगे, दो ifs का घोंसला बनाना && का उपयोग करने के समान नहीं है। अन्य शर्तें, जैसे कि #else, एक समस्या पैदा कर सकती हैं। केवल पहले विकल्प का वास्तव में मतलब वही है जो पूछने वाले ने पूछा था।
zeel

1

उन लोगों के लिए जो उदाहरण के लिए देख सकते हैं (UNIX / g ++) जो ओपी से थोड़ा अलग है, यह मदद कर सकता है:

`

#if(defined A && defined B && defined C)
    const string foo = "xyz";
#else
#if(defined A && defined B)
    const string foo = "xy";
#else
#if(defined A && defined C)
    const string foo = "xz";
#else
#ifdef A
    const string foo = "x";
#endif
#endif
#endif
#endif

सिर्फ #else #if के बजाय #elif और अंत में एक अरब # endif का उपयोग क्यों नहीं किया जाता ...?
इलियट

-3

VS2015 के रूप में उपरोक्त कार्यों में से कोई भी नहीं। सही निर्देश है:

#if (MAX && !MIN)

यहाँ और देखें


2
आपने C # प्रलेखन से जोड़ा है, C ++ एक से नहीं।
Revolver_Ocelot
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.