2013-05-08 8 views
19

का उपयोग करने के लिए कौन सा बेहतर है मैंने सीखा है कि if या #if दोनों का उपयोग शर्त जांच के लिए किया जा सकता है। चूंकि हम if का उपयोग कर स्थितियों की जांच कर सकते हैं, हम प्रीप्रोसेसर #if का उपयोग क्यों करेंगे?"अगर" और "#if";

यदि मैं if के बजाय #if का उपयोग करता हूं तो यह मेरे कोड में क्या अंतर करेगा?

कौन सा उपयोग करने के लिए बेहतर है और क्यों?

+4

लुकअप "प्रीप्रोसेसर"। –

+11

मुझे -1 एस समझ में नहीं आता है। पूरी तरह से नोबिश होने पर, यह एक बहुत ही वैध सवाल है। और यदि आप "प्रीप्रोसेसर" कीवर्ड नहीं जानते हैं तो आसानी से गुगलेबल नहीं। – Dariusz

+12

मुझे "रचनात्मक नहीं के रूप में बंद" वोट नहीं समझते हैं: यह कुछ सरल लेकिन पूरी तरह से वैध प्रश्न है। – dasblinkenlight

उत्तर

28

if और #if को यह हिस्सा

उदाहरण टिप्पणी की है कि यह विभिन्न प्रयोजनों के साथ अलग बातें हैं।

यदि आप if कथन का उपयोग करते हैं, तो स्थिति को रनटाइम पर मूल्यांकन किया जाता है, और दोनों शाखाओं के लिए कोड संकलित प्रोग्राम के भीतर मौजूद होता है। स्थिति रनटाइम जानकारी, जैसे एक चर की स्थिति पर आधारित हो सकती है। if एक कार्यक्रम में मानक प्रवाह नियंत्रण के लिए है।

आप उपयोग पूर्वप्रक्रमक के #if, हालत संकलन समय पर मूल्यांकन किया जाता है, और झूठे शाखा के लिए कोड नहीं संकलित कार्यक्रम में शामिल है। स्थिति केवल संकलन-समय की जानकारी (जैसे #define स्थिरांक और इसी तरह) पर आधारित हो सकती है। #if विभिन्न संकलन-समय वातावरण के लिए अलग-अलग कोड रखने के लिए है (उदाहरण के लिए, विंडोज बनाम * निक्स पर संकलन के लिए अलग कोड, उस तरह की चीज़)।

+0

अच्छा और साफ स्पष्टीकरण। धन्यवाद – kalmanIsAGameChanger

12

हम यह नहीं कह सकता है जो बेहतर उपयोग करने के लिए, क्योंकि एक संकलन चरण (#if) और अन्य एक में प्रयोग किया जाता है इसके बाद के संस्करण कोड का निर्माण करने के क्रम चरण में (if)

#if 1 
    printf("this code will be built\n"); 
#else 
    printf("this code will not\n"); 
#endif 

कोशिश प्रयोग किया जाता है gcc -E साथ और आप देखेंगे कि आपके संकलक केवल युक्त एक और कोड जनरेट करेगा देखेंगे:

printf("this code will be build\n"); 

अन्य printf नए कोड (पूर्व प्रोसेसर कोड) और फिर कार्यक्रम बाइनरी में कोई वर्तमान में मौजूद नहीं होगा।

निष्कर्ष: #if संकलन चरण में व्यवहार किया जाता है, लेकिन जब अपने कार्यक्रम चलाने

आप अपने कोड के एक भाग में #if 0 उपयोग कर सकते हैं inorder यह संकलन करने संकलक से बचने के लिए सामान्य if व्यवहार किया जाता है। जैसे आप

int main(void) { 

     printf("this code will be build\n"); 
#if 0 
     printf("this code will not\n"); 
#endif 

} 

यह बराबर है

int main(void) { 

     printf("this code will be built\n"); 
/* 
     printf("this code will not\n"); 
*/ 

} 
+0

"एक संकलन चरण (#if) में प्रयोग किया जाता है और दूसरा संकलन चरण (यदि)" में उपयोग किया जाता है ";) –

+0

@MichalB। यह टाइपो है :) – MOHAMED

3

आपको #if का उपयोग करना चाहिए जब स्थिति का नतीजा संकलन समय पर नियमित रूप से जाना जाता है और नियमित रूप से जब परिणाम रनटाइम तक ज्ञात नहीं होता है।

#if DEBUG 

मैं संकलन समय पर पता है कि मैं एक डिबग

if (date == DateTime.Today) 

निर्माण कर रही हूँ कौन सा दिन

6

है पर निर्भर करता है अरे दोनों अलग

  1. #if टेस्ट करता है, तो कर रहे हैं शर्त संकलन समय पर सच है।
  2. if रनटाइम पर मूल्यांकन किया जाता है।
1

#if से कुछ प्रयोग हैं:

  • आप अतिरिक्त प्रिंट, या चेक डाल करने के लिए जब आप
  • आप संकलक सुनिश्चित करने के लिए एक को शामिल नहीं करता चाहते हैं कि आपके कोड का एक डिबग संस्करण का निर्माण चाहते हैं .h फ़ाइल दो बार
  • आप कोड लिखना चाहते हैं जो विभिन्न सिस्टम कॉल का उपयोग करेगा, और सिस्टम के आधार पर इसे उचित उपयोग पर संकलित किया जाएगा।

क्योंकि ऊपर के सभी संकलन समय पर जाँच कर रहे हैं इसका मतलब है कि:

  • हालत compiletime पर मूल्यांकन किया जाना
  • उत्पादित कोड शाखाओं कि का मूल्यांकन शामिल नहीं होंगे में सक्षम होना चाहिए झूठा, छोटे कोड की ओर अग्रसर होता है, और तेज़, क्योंकि कार्यक्रम चलाने पर हर बार स्थिति की जांच नहीं की जाती है।

उदाहरण:

केवल डिबग मोड के लिए अतिरिक्त चेकों जोड़ना:

#define DEBUGLEVEL 2 

#if DEBUGLEVEL > 1 
    printf("The value of x is: %d", x); 
#end if 

#if DEBUGLEVEL > 2 
    printf("The address of x is: %x", &x); 
    ASSERT(x > 100); 
#end if 

हैडर सुनिश्चित करना केवल एक बार शामिल हो जाता है:

#ifndef PERSON_H 
#define PERSON_H 
    class Person{ 
     .... 
    }; 
#end if 

मंच के आधार पर अलग कोड के बाद:

#ifdef WINDOWS 
    time = QueryPerformanceCounter(..); 
#else 
    time = gettimeofday(..); 
#endif 
संबंधित मुद्दे