असली समस्या यह है कि परिभाषित करता है के द्वारा नियंत्रित किया जाता है है शेष भाषा (प्रीप्रोसेसर) से एक अलग उपकरण। नतीजतन, संकलक इसके बारे में नहीं जानता है, और कुछ गलत होने पर आपकी मदद नहीं कर सकता - जैसे प्रीप्रोसेसर नाम का पुन: उपयोग करना।
max
के मामले पर विचार करें जिसे कभी-कभी मैक्रो के रूप में लागू किया जाता है। नतीजतन, आप अपने कोड में कहीं भी पहचानकर्ता max
का उपयोग नहीं कर सकते हैं। कहीं भी। लेकिन संकलक आपको नहीं बताएगा। इसके बजाए, आपका कोड बहुत गलत हो जाएगा और आपको पता नहीं है कि क्यों।
अब, कुछ देखभाल के साथ इस समस्या को कम किया जा सकता है (अगर पूरी तरह से समाप्त नहीं किया गया है)। लेकिन #define
के अधिकांश उपयोगों के लिए वैसे भी बेहतर विकल्प हैं, इसलिए लागत/लाभ गणना कम हो जाती है: के लिए मामूली नुकसान कुछ भी लाभ। जब कोई लाभ नहीं मिलता है तो दोषपूर्ण सुविधा का उपयोग क्यों करें?
- एक निरंतर आवश्यकता है:
तो यहाँ एक बहुत ही सरल चित्र है? एक निरंतर (परिभाषित नहीं)
- फ़ंक्शन की आवश्यकता है? एक फ़ंक्शन का उपयोग करें (परिभाषित नहीं)
- ऐसी किसी चीज़ की आवश्यकता है जिसे स्थिर या फ़ंक्शन का उपयोग करके मॉडलिंग नहीं किया जा सके? परिभाषित करें, लेकिन इसे ठीक से करें।
यह करना "ठीक से" अपने आप में एक कला है, लेकिन कुछ आसान दिशानिर्देश हैं:
एक अनूठा नाम का प्रयोग करें। सभी राजधानियों, हमेशा एक अद्वितीय पुस्तकालय पहचानकर्ता द्वारा prefixed। max
? बाहर। VERSION
? बाहर। इसके बजाय, MY_COOL_LIBRARY_MAX
और MY_COOL_LIBRARY_VERSION
का उपयोग करें। उदाहरण के लिए, मैक्रोज़ के बड़े उपयोगकर्ता बूस्ट लाइब्रेरीज़, हमेशा BOOST_<LIBRARY_NAME>_
से शुरू होने वाले मैक्रोज़ का उपयोग करें।
मूल्यांकन से सावधान रहें। असल में, मैक्रो में एक पैरामीटर केवल टेक्स्ट है जिसे प्रतिस्थापित किया जाता है। नतीजतन, #define MY_LIB_MULTIPLY(x) x * x
टूटा हुआ है: इसे MY_LIB_MULTIPLY(2 + 5)
के रूप में उपयोग किया जा सकता है, जिसके परिणामस्वरूप 2 + 5 * 2 + 5
हो सकता है। हम क्या चाहते थे नहीं। इसके खिलाफ सुरक्षा के लिए, हमेशा parenhesise सभी तर्कों का उपयोग (जब तक आप बिल्कुल जानते हैं कि आप क्या कर रहे हैं - spoiler: शायद आप नहीं करते; यहां तक कि विशेषज्ञों को अक्सर यह गलत लगता है)।
इस मैक्रो का सही संस्करण होगा:
#define MY_LIB_MULTIPLY(x) ((x) * (x))
लेकिन अभी भी दोहराना के लिए मैक्रो बहुत गलत हो रही है, और, के तरीकों में से बहुत सारे हैं, संकलक आप मदद नहीं करेगा यहाँ।
स्रोत
2012-04-21 18:50:05
इस प्रश्न के विपरीत: [एक चर के बजाय #define का उपयोग क्यों करें] (http://stackoverflow.com/questions/6004963/why-use-define-instead-of-a-variable) –
'परिभाषित करें ' एस मुश्किल संरचनाएं हैं और आसानी से गलत इस्तेमाल या दुर्व्यवहार किया जा सकता है। लेकिन 'गोटो' की तरह वे बहुत उपयोगी हो सकते हैं। – Anycorn
[स्थिर कॉन्स बनाम #define] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/1637332/static-const-vs-define), विशेष रूप से यह [उत्तर] (http://stackoverflow.com/a/ 3835772/61574) पर्याप्त होना चाहिए। – Anonymous