2016-09-02 20 views
15

मेरे पास कोड है कि मैं दो मोड, डीबग और वर्बोज डिबग करना चाहता हूं। मैं अब तक के रूप में मेरे हेडर फाइल में उन्हें परिभाषित#if परिभाषित मैक्रो #ifdef मैक्रो के बराबर है?

#define verbose TRUE 
#define debug TRUE 

मेरे कोड में, मैं सिर्फ

#if(debug) 
    //code 
#endif 

उपयोग किया गया है, लेकिन है यह अधिक उचित

#ifdef debug 
    // code 
#endif 

मैंने पढ़ा उपयोग करने के लिए प्रीप्रोसेसर मैक्रोज़ के बारे में कुछ लेकिन उस समय यह समझ में नहीं आया। तो, मेरे पास सवाल है, #ifdef MACRO के बराबर है? और कोड के विशेष अनुभाग को सक्षम/अक्षम करने के लिए कौन सा बेहतर है?

+8

ऐसा लगता है कि 'if'f'' 'if' के साथ' #if परिभाषित 'के साथ नहीं, जैसा कि शीर्षक बताता है। –

+3

दोनों के बीच का अंतर यह है कि '# ifdef' केवल एक शर्त, का उपयोग कर सकता है जबकि' #if परिभाषित (NAME) 'यौगिक सशर्त कर सकता है। – LPs

+2

बीटीडब्लू, संपादित करने के बाद, आपका कोड अलग है: '# if' डीबग चेक करता है यदि' डीबग' सही है, जबकि 'ifdef' केवल तभी जांचता है जब 'डीबग' परिभाषित किया गया हो। – LPs

उत्तर

16
#ifdef MACRO 
#if defined (MACRO) 

वही काम करेगा। हालांकि, परिभाषित (मैक्रो) सिर्फ एक अभिव्यक्ति है जो #if के अंदर 0 या 1 का मूल्यांकन करती है, और इसे अन्य अभिव्यक्तियों के साथ जोड़ा जा सकता है। उदाहरण

#if defined (MACRO) && ! defined (MACRO2) 
    // Do this 
#else 
    // Do that 
#endif 

#ifdef साथ कर रही प्रयास करें के लिए - जब तक आपके कोड वास्तव में अनाड़ी हो जाता है आप नहीं कर सकते।

+1

'परिभाषित' को कोष्ठक की आवश्यकता नहीं है। इसमें दो रूप हैं: 'परिभाषित (पहचानकर्ता)' और 'परिभाषित पहचानकर्ता'। – Kaz

5

#if defined(MACRO)#ifdef MACRO जैसा ही है, लेकिन यह लंबा है। दूसरी ओर यह || या && के साथ अतिरिक्त स्थितियों को जोड़ने की अनुमति देता है।

#if MACRO#ifdef MACRO के समान नहीं बल्कि 100% है। यदि MACRO0 है तो #if MACRO नकारात्मक होगा - यह आवश्यकता है MACRO से परिभाषित करने की और 0 नहीं हो। #ifdef चेकों केवल क्या यह मान (#define MACRO) के बिना भी परिभाषित किया गया है।

अब मूल्य 1 या 0 के साथ #if का उपयोग करें और अक्षम परिभाषाओं सक्षम/करने के लिए आधुनिक है:

#define FLAG_X 1 // or 0

1

हम पर्याप्त हमारे दिमाग रैक है, तो हम एक अंतर के साथ आ सकते हैं। लेकिन यह अस्पष्ट है और अपरिभाषित व्यवहार शामिल है, तो यह कोई महत्व की है अगर हम सभी के बारे में परवाह है कि क्या कोड सख्ती से आईएसओ सी के अनुरूप है

#if defined ... रूप में अलग ढंग से व्यवहार कर की संभावना है अगर पहले एक #define defined ... मैक्रो संसाधित किया गया था । (उन मैक्रो के अलावा

पहले मूल्यांकन करने के लिए, पूर्व प्रसंस्करण टोकन कि नियंत्रित निरंतर अभिव्यक्ति हो जाएगा की सूची में मैक्रो आमंत्रण बदल दिया जाता है: आईएसओ C99 मानक में यह #if और #elif निर्देशों के संबंध में लिखा गया था, परिभाषित यूनरी ऑपरेटर द्वारा संशोधित नाम), जैसा कि सामान्य पाठ में है।

कोई आवश्यकता defined एकल ऑपरेटर समझते हैं और मैक्रो के रूप में इलाज किया जा रहा से संरक्षित किया कि दिया गया है; यह सिर्फ "preprocessing टोकन कि हो जाएगा ... अभिव्यक्ति" से एक है। defined ऑपरेटर केवल इस स्तर पर विस्तार से अपने तर्क की रक्षा के प्रयोजनों के लिए मान्यता प्राप्त है।

तो define की परिभाषा के रूप में एक मैक्रो बस खड़े करने के लिए अनुमति दी है, और defined की घटनाओं को बाद में बदल दिया जाता है (#if preprocessing निर्देशों के बहस में भी शामिल है) इस प्रकार, #if defined के साथ हस्तक्षेप करते हुए #ifdef को प्रभावित नहीं।

शायद सी 99 के बाद से भाषा का यह क्षेत्र कड़ा हो गया था।

3

अगर मैं पढ़ रहा हूँ अपने प्रश्न का सही शीर्षक भ्रामक है, यह होना चाहिए

Is #if MACRO equivalent to #ifdef MACRO? 

वे बराबर नहीं हैं, लेकिन वे कर सकते हैं (और अक्सर कर रहे हैं) दोनों द्विआधारी मोड हैं जो निर्दिष्ट करने के लिए प्रयोग किया जाता है या तो पर या बंद। पसंद मेरी राय में, व्यक्तिगत वरीयता का मामला है।

आप पहला विकल्प का उपयोग कर रहे हैं और या तो

#define verbose true 

या

#define verbose false 

और फिर राशि का उपयोग कर मोड जाँच या तो

#if verbose 

या

#if !verbose 

वास्तव में, मैं आप या तो TRUE या सच के बजाय 1 और या तो गलत या झूठी 0 के बजाय, क्योंकि सच और झूठे, उपयोग का सुझाव देंगे कर रहे हैं C/C++ मूल्यों और पूर्व प्रोसेसर नहीं है (या हो सकता है) सी/सी ++ मूल्यों तक पहुंच।

वैसे भी, अन्य आम तरीका द्विआधारी मोड निर्दिष्ट करने के लिए या तो झंडा परिभाषित या यह अपरिभाषित जिस स्थिति में आप या तो

#define verbose any thing (including nothing) goes here 

है या #define बाहर छोड़ सकते हैं छोड़ने के लिए है।

और फिर आप, परीक्षण कर सकते हैं कि क्या झंडा परिभाषित किया गया है या तो

#ifdef verbose 

या इसके समकक्ष

#if defined(verbose) 

नोट के साथ: इस मामले में, आप ध्वज के मूल्य का परीक्षण नहीं कर रहे हैं आप केवल यह जांचने की आवश्यकता है कि यह परिभाषित किया गया है या नहीं।

आप भी परीक्षण कर सकते हैं, तो इसे और अधिक सुविधाजनक है झंडा या तो

#ifndef verbose 

या इसके समकक्ष के साथ अपरिभाषित है या नहीं

#if !defined(verbose) 
+0

[TO OP] भ्रामक शीर्षक: कृपया ठीक करें। यह अन्य उत्तरों को अमान्य कर देगा, लेकिन आपको इसे करना चाहिए। –

5

नहीं, वे सब बराबर नहीं हैं। शाखा संकलित की जाती है यदि MACRO गैर-शून्य का मूल्यांकन करता है। दूसरी ओर, यदि MACROपरिभाषित, कोई बात नहीं क्या यह का आकलन करती है एक #ifdef MACRO शाखा संकलित किया गया है।जबकि लाइन printf("#if VAR_SET_TO_FALSE\n"); नहीं है तो

#include <stdio.h> 

#define VAR_SET_TO_TRUE 1 
#define VAR_SET_TO_FALSE 0 

int main() 
{ 

#if VAR_SET_TO_TRUE 
    printf("#if VAR_SET_TO_TRUE\n"); 
#endif 

#if VAR_SET_TO_FALSE 
    printf("#if VAR_SET_TO_FALSE\n"); 
#endif 

#if VAR_UNSET 
    printf("#if VAR_UNSET\n"); 
#endif 



#ifdef VAR_SET_TO_TRUE 
    printf("#ifdef VAR_SET_TO_TRUE\n"); 
#endif 

#ifdef VAR_SET_TO_FALSE 
    printf("#ifdef VAR_SET_TO_FALSE\n"); 
#endif 

#ifdef VAR_UNSET 
    printf("#ifdef VAR_UNSET\n"); 
#endif 

} 

इच्छा उत्पादन

#if VAR_SET_TO_TRUE 
#ifdef VAR_SET_TO_TRUE 
#ifdef VAR_SET_TO_FALSE 

नोट लाइन printf("#ifdef VAR_SET_TO_FALSE\n"); संकलित किया गया है कि। पहला संकलित किया गया है, क्योंकि VAR_SET_TO_FALSEपरिभाषित है, भले ही इसका मान false है।

+1

ओपी '# ifdef' और' #if परिभाषित 'के बीच के अंतर के बारे में पूछ रहा है,' # if' और '#if परिभाषित' के बीच का अंतर नहीं - शायद आप उस मामले में अपना उत्तर अनुकूलित कर सकते हैं। स्मृति से '# if' खंडों को निष्पादित किया जाता है यदि आरएचएस गैर-शून्य का मूल्यांकन करता है, 1 तक नहीं। – abligh

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