2013-01-22 14 views
15

मैं के बारे में __noop पढ़ रहा था और MSDN उदाहरणक्यों और कब __noop का उपयोग करें?

#if DEBUG 
    #define PRINT printf_s 
#else 
    #define PRINT __noop 
#endif 

int main() { 
    PRINT("\nhello\n"); 
} 

है और मैं सिर्फ एक खाली मैक्रो होने से अधिक लाभ नहीं दिख रहा है:

#define PRINT 

उत्पन्न कोड एक ही है। __noop का उपयोग करने का एक वैध उदाहरण क्या है जो वास्तव में उपयोगी बनाता है?

+0

मुझे लगता है कि ऐसी स्थितियां हैं जहां "कोई कथन नहीं" बदलता है कि चीजें कैसे काम करती हैं। पूरी तरह से यकीन नहीं है कि मैं अभी एक के बारे में सोच सकता हूं। –

+2

बीटीडब्ल्यू, उनका उदाहरण थोड़ी डोडी है क्योंकि यह डिबग और रिलीज मोड में एक अलग प्रकार के साथ अभिव्यक्ति में परिणाम देता है। लेकिन यह डीबग मोड में टाइप के रूप में उतना ही नहीं है जितना कि 'प्रिंटर' के लिए "तर्क" थे! वैराडिक मैक्रोज़ बेहतर व्यवहार वाली परिभाषा '# परिभाषित करें प्रिंट करें (...) ((शून्य) printf_s (__ VA_ARGS __))' और '# प्रिंट करें (...) ((शून्य) 0) ', और यह आपको रोकता है 'प्रिंट' के साथ एक फ़ंक्शन पॉइंटर लेने का प्रयास कर रहा है। –

उत्तर

15

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

आपके मामले में तर्क है कि आसानी से बाहर अनुकूलित किया जा सकता है एक स्पष्ट पक्ष प्रभाव स्वतंत्र अभिव्यक्ति है, इसलिए यह कोई फर्क नहीं पड़ता।

लेकिन यदि तर्क अभिव्यक्ति के दुष्प्रभाव हैं या यह इतना जटिल है कि संकलक यह साबित नहीं कर सकता कि यह सामान्य रूप से समाप्त हो जाता है और इसका कोई दुष्प्रभाव नहीं होता है तो __noop का उपयोग करके उस अभिव्यक्ति के संभावित महंगे मूल्यांकन को रोकता है।

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

+0

हाँ, मुझे लगता है कि यह यह है। :) –

12
#define PRINT 
extern int some_complicated_calculation(); 
PRINT("%d\n", some_complicated_calculation()); 

फ़ंक्शन को कॉल करेगा, भले ही आप परिणाम नहीं चाहते हैं।

__noop का उपयोग करके, समारोह नहीं कहा जाएगा।

आप (मानते हैं कि कंपाइलर वैरिएड मैक्रोज़ का समर्थन करता है) तर्कों को अनदेखा करने के लिए PRINT परिभाषित करता है; लेकिन फिर उन्हें बिल्कुल पार्स नहीं किया जाएगा, और यदि आप कुछ ऐसा करने के लिए PRINT को परिभाषित करने वाले संस्करण को संकलित किए बिना उनके चारों ओर कोड बदलते हैं तो अमान्य हो सकता है। __noop का उपयोग करके, तर्क अभी भी पार्स किए गए हैं, इसलिए वैध रहने की अधिक संभावना है।

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