कई प्रश्नों के लिए, इस प्रश्न का उत्तर निर्भर करता है । यह कहने के बजाय कि जो बेहतर है मैंने उसके उदाहरण और लक्ष्य दिए हैं जहां एक दूसरे से बेहतर है।
प्रीप्रोसेसर और स्थिरांक दोनों के उपयुक्त उपयोग के अपने स्थान हैं।
प्री-प्रोसेसर के मामले में, संकलन समय से पहले कोड हटा दिया जाता है। इसलिए, यह उन परिस्थितियों के लिए सबसे उपयुक्त है जहां कोड की उम्मीद नहीं है । यह मॉड्यूल संरचना, निर्भरता को प्रभावित कर सकता है, और यह प्रदर्शन पहलुओं के लिए सर्वश्रेष्ठ कोड सेगमेंट चुनने की अनुमति दे सकता है। निम्नलिखित मामलों में, किसी को केवल प्रीप्रोसेसर के उपयोग से कोड को विभाजित करना होगा।
बहु-प्लेटफ़ॉर्म कोड:
उदाहरण के लिए, जब कोड को विभिन्न प्लेटफार्मों के तहत संकलित किया जाता है, जब कोड में ओएस के विशिष्ट संस्करण संख्याओं पर निर्भरता होती है (या यहां तक कि संकलक संस्करण - हालांकि यह बहुत दुर्लभ है)। उदाहरण के लिए जब आप कोड के छोटे-एंडियन बड़े-एंडियन समकक्षों के साथ काम कर रहे हैं - तो उन्हें स्थिरांक के बजाय पूर्वप्रक्रमकों के साथ अलग किया जाना चाहिए। या यदि आप विंडोज के लिए कोड के रूप में अच्छी तरह से लिनक्स और कुछ सिस्टम कॉल बहुत अलग हैं संकलन कर रहे हैं।
प्रायोगिक पैच:
एक अन्य मामला जहां यह सुनिश्चित करता है कि कुछ प्रायोगिक कोड है जो कि जोखिम भरा है या कुछ प्रमुख मॉड्यूल जिन्हें छोड़ा जाना आवश्यक है जिनमें महत्वपूर्ण लिंकिंग या प्रदर्शन अंतर होगा। कारण अगर कोई () के तहत छिपाने के बजाय प्रीप्रोसेसर के माध्यम से कोड को अक्षम करना चाहेगा , क्योंकि हम इस विशिष्ट परिवर्तन सेट द्वारा शुरू किए गए बग के बारे में सुनिश्चित नहीं हो सकते हैं और हम प्रयोगात्मक आधार पर चल रहे हैं। यदि यह विफल रहता है, तो हमें फिर से लिखने के बजाय उत्पादन में उस कोड को अक्षम करने के अलावा और कुछ नहीं करना चाहिए । पूरे कोड को कमेंट करने के लिए उपयोग करने के लिए कुछ समय आदर्श है ।#if 0
निर्भरता से निपटना:
एक और कारण जहां आप जेनरेट करना चाहते हैं उदाहरण के लिए, यदि आप जेपीईजी छवियों का समर्थन नहीं करना चाहते हैं, तो आप उस मॉड्यूल / स्टब को संकलित करने से छुटकारा पाने में मदद कर सकते हैं और अंततः पुस्तकालय (सांख्यिकीय या गतिशील रूप से) लिंक नहीं करेगा मापांक। कभी-कभी पैकेज ./configure
ऐसी निर्भरता की उपलब्धता की पहचान करने के लिए चलते हैं और यदि पुस्तकालय मौजूद नहीं हैं, (या उपयोगकर्ता सक्षम नहीं करना चाहता है) तो उस लाइब्रेरी से लिंक किए बिना ऐसी कार्यक्षमता स्वचालित रूप से अक्षम हो जाती है। यहां यह हमेशा फायदेमंद होता है यदि ये निर्देश ऑटो उत्पन्न होते हैं।
लाइसेंसिंग:
प्रीप्रोसेसर निर्देश के उदाहरण का एक बहुत दिलचस्प ffmpeg है । इसमें कोडेक्स हैं जो संभावित रूप से इसके उपयोग से पेटेंट का उल्लंघन कर सकते हैं। यदि आप स्रोत डाउनलोड करते हैं और इंस्टॉल करने के लिए संकलन करते हैं, तो यह आपसे पूछता है कि क्या आप चाहते हैं या इस तरह के सामान को दूर रखें। कुछ शर्तों के तहत कोड छिपाए रखना अगर अभी भी स्थिति आपको अदालत में ला सकती है!
कोड कॉपी-पेस्ट:
आका मैक्रोज़। यह मैक्रोज़ का उपयोग करने के लिए एक सलाह नहीं है - बस मैक्रोज़ के पास कॉपी-पास्ट समकक्ष लागू करने का अधिक शक्तिशाली तरीका है । लेकिन इसे बहुत सावधानी से उपयोग करें; और इसका उपयोग करें यदि आप जानते हैं कि आप क्या कर रहे हैं। बेशक, ऐसा नहीं कर सकते। लेकिन एक inline
कार्य का उपयोग कर सकते हैं अगर ऐसा करना आसान है।
तो आप स्थिरांक का उपयोग कब करते हैं?
लगभग हर जगह।
निटर कोड प्रवाह:
सामान्य तौर पर, जब आप स्थिरांक का उपयोग करते हैं, तो यह नियमित रूप से चर से लगभग अप्रभेद्य होता है और इसलिए, यह बेहतर पठनीय कोड है। यदि आप रूटीन लिखते हैं जो कि 75 पंक्तियाँ हैं - # 10 के बाद हर 10 पंक्तियों के बाद 3 या 4 पंक्तियाँ हैं, तो यह पढ़ने में असमर्थ है । संभवतः #ifdef द्वारा शासित एक प्राथमिक निरंतरता दी गई है, और हर जगह एक प्राकृतिक प्रवाह में इसका उपयोग करें।
अच्छी तरह से इंडेंटेड कोड: सभी प्रीप्रोसेसर निर्देश, अन्यथा अच्छी तरह से इंडेंट कोड के साथ कभी भी काम नहीं करते हैं । यहां तक कि अगर आपका कंपाइलर #def के इंडेंटेशन की अनुमति देता है, तो प्री-एएनएसआई सी प्रीप्रोसेसर ने एक लाइन की शुरुआत और "#" चरित्र के बीच जगह की अनुमति नहीं दी; अग्रणी "#" को हमेशा पहले कॉलम में रखा जाना चाहिए था।
कॉन्फ़िगरेशन:
एक और कारण है कि स्थिरांक या चर समझ में आता है कि वे आसानी से ग्लोबल्स से जुड़े होने से विकसित हो सकते हैं या भविष्य में कॉन्फ़िगरेशन फ़ाइलों से प्राप्त किए जा सकते हैं।
एक आखिरी बात:
कभी भी यूएसई प्रीप्रोसेसर
के दायरे #ifdef
को #endif
पार करने के निर्देश नहीं या { ... }
। के विभिन्न पक्षों पर यानी की शुरुआत #ifdef
या अंत । यह बेहद खराब है; यह भ्रामक हो सकता है, यह कभी-कभी खतरनाक हो सकता है।#endif
{ ... }
यह निश्चित रूप से, एक संपूर्ण सूची नहीं है, लेकिन आपको स्पष्ट अंतर दिखाता है, जहां किस विधि का उपयोग करने के लिए अधिक उपयुक्त है। यह वास्तव में नहीं है कि कौन सा बेहतर है , यह अधिक है जिसमें से किसी दिए गए संदर्भ में उपयोग करना अधिक स्वाभाविक है।