हैडर में मैक्रो बनाम स्टेटिक फ़ंक्शन


9

बहुत से त्वरित कार्यों के लिए, जहाँ कोई व्यक्ति किसी कार्य को नियोजित कर सकता f(x,y)है, सादे सी में, मैक्रोज़ का उपयोग किया जाता है। मैं इन मामलों के बारे में विशेष रूप से पूछना चाहता हूं, जो एक फ़ंक्शन कॉल द्वारा हल किए जा सकते हैं (यानी इनलाइनिंग कार्यों के लिए उपयोग किए जाने वाले मैक्रो, मनमाने कोड के कोड विस्तार के लिए नहीं)।

आमतौर पर C फ़ंक्शन इनलाइन नहीं होते हैं क्योंकि वे अन्य C फ़ाइलों से लिंक किए जा सकते हैं। हालाँकि, स्थिर C फ़ंक्शंस केवल C फ़ाइल के भीतर से ही दिखाई देते हैं जिन्हें वे परिभाषित करते हैं। इसलिए उन्हें संकलक द्वारा इनवेट किया जा सकता है। मैंने सुना है कि बहुत सारे मैक्रो को स्थिर कार्यों में बदलकर बदल दिया जाना चाहिए, क्योंकि यह सुरक्षित कोड का उत्पादन करता है।

क्या ऐसे मामले हैं जहां यह एक अच्छा विचार नहीं है?

दोबारा: ## एक जैसे निर्माणों के साथ कोड-प्रोडक्शन मैक्रोज़ के बारे में नहीं पूछा जाना चाहिए जो एक फ़ंक्शन के रूप में व्यक्त नहीं किए जा सकते।


4
मुझे लगता है कि अगर आपके प्रश्न का उत्तर दिया गया है हो सकता है stackoverflow.com/questions/9104568/macro-vs-function-in-c और यहाँ stackoverflow.com/questions/1358232/why-use-macros-in-c
मारू

एक उचित मैक्रो लिखना एक दर्द है, और inlineकार्य केवल यह सुनिश्चित करता है कि इसे बाइनरी में कई बार परिभाषित किया जा सकता है, संकलक यह तय कर सकता है कि क्या यह वास्तव में अंतरिक्ष को बचाने के लिए इसे इनलाइन करेगा
शाफ़्ट सनकी

2
मुझे वास्तव में संदेह होगा कि इनमें से अधिकांश ऐतिहासिक कारण हैं। युग से पहले, सी संकलक इनलाइन कार्यों को बिल्कुल नहीं करता था। इसलिए लोग मैक्रोज़ का इस्तेमाल उन चीजों के लिए करते हैं जो वे चाहते थे। सी कोड आमतौर पर लंबे समय तक रहने वाला होता है।
जन हडेक

@ratchetfreak: C के पास नहीं है inline, यह C ++ के बारे में नहीं है।
सिरका

2
@wirrbel बेशक inlineसी में है, कम से कम C99 के बाद से। एक त्वरित अवलोकन के लिए, इनलाइन फ़ंक्शन पर विकिपीडिया देखें ।
आमोन

जवाबों:


6

मैक्रो जो एक फ़ंक्शन कॉल द्वारा हल करने योग्य होते हैं, उनमें बहुत सारे नुकसान होते हैं:

  • वे लिखना कठिन है, क्योंकि आपको ठीक तरह से तर्क को संभालना पड़ सकता है ++i
  • वे एक दृश्य डीबगर के साथ डीबग करना कठिन हैं क्योंकि आप एक मैक्रो के माध्यम से कदम नहीं उठा सकते हैं या वहां एक ब्रेकपॉइंट नहीं डाल सकते हैं।
  • संकलन निर्भरता का विश्लेषण करते समय उन्हें सही ढंग से संभालना मुश्किल होता है।

मैक्रो जो एक फ़ंक्शन कॉल द्वारा हल करने योग्य होते हैं, एक आदिम संकलक में इनलाइनिंग प्रदान करने के लिए उपयोगी हो सकते थे। मैं किसी भी संकलक को इनलाइन फ़ंक्शंस से निपटने के बारे में नहीं जानता हूं और कुछ भी कंप्लायंस यूनिट्स में इनलाइन नहीं कर सकते हैं।

आमतौर पर C फ़ंक्शन इनलाइन नहीं होते हैं क्योंकि वे अन्य C फ़ाइलों से लिंक किए जा सकते हैं।

कोई कारण नहीं है कि एक कंपाइलर एक फ़ंक्शन के दो संस्करण, एक पारंपरिक callएड एक और inlineडी एक प्रदान करने में सक्षम नहीं होगा । आपको उस संकलक के प्रलेखन को देखना चाहिए जिसे आप लक्षित कर रहे हैं। साथ ही, आप जनरेट किए गए असेंबली को देखना चाहते हैं: भले ही आपको असेंबली की जानकारी न हो, लेकिन आप यह बताना जल्दी सीख सकते हैं कि कोई फंक्शन इनबिल्ट हुआ है या नहीं। (इसे जानने के लिए शिशु-उदाहरणों से शुरुआत करें।)

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