सबसे पहले, मैंने पाया कि इसकी #define का उपयोग करके निरंतर के प्रकार को परिभाषित करना संभव नहीं है, ऐसा क्यों है?
क्यों क्या है? यह सच नहीं है:
#define MY_INT_CONSTANT ((int) 12345)
दूसरा, क्या उनमें से किसी एक को दूसरे पर इस्तेमाल करने के कोई फायदे हैं?
हाँ। #defineएक मैक्रो को परिभाषित करता है जिसे संकलन शुरू होने से पहले ही बदल दिया जाता है। constयदि आप इसे बदलने का प्रयास करते हैं तो कंपाइलर एक चर को संशोधित करता है, ताकि कंपाइलर एक त्रुटि को चिह्नित करेगा। ऐसे संदर्भ हैं जिनमें आप उपयोग कर सकते हैं #defineलेकिन आप एक का उपयोग नहीं कर सकते हैं const(हालांकि मैं नवीनतम क्लैंग का उपयोग करके खोजने के लिए संघर्ष कर रहा हूं)। सिद्धांत रूप constमें, निष्पादन में जगह लेता है और स्मृति के संदर्भ की आवश्यकता होती है, लेकिन व्यवहार में यह महत्वहीन है और संकलक द्वारा दूर अनुकूलित किया जा सकता है।
consts तुलना में अधिक संकलक और डिबगर के अनुकूल हैं #define। ज्यादातर मामलों में, यह ओवरराइडिंग बिंदु है जिस पर आपको निर्णय लेना चाहिए, जिस पर उपयोग करना है।
सिर्फ एक संदर्भ के बारे में सोचा है जिसमें आप उपयोग कर सकते हैं #defineलेकिन नहीं const। यदि आपके पास एक स्थिरांक है जिसे आप बहुत सारी .cफाइलों में उपयोग करना चाहते हैं , #defineतो आप इसे हेडर में चिपका सकते हैं। constआप के साथ एक सी फ़ाइल में एक परिभाषा है और
const int MY_INT_CONST = 12345;
extern const int MY_INT_CONST;
एक हेडर में। MY_INT_CONSTकिसी भी सी फ़ाइल में एक स्थिर या वैश्विक स्कोप सरणी के आकार के रूप में इस्तेमाल नहीं किया जा सकता है, सिवाय इसके कि इसमें कोई भी परिभाषित नहीं है।
हालाँकि, पूर्णांक स्थिरांक के लिए आप एक का उपयोग कर सकते हैं enum। वास्तव में ऐसा ही है जो Apple लगभग हमेशा करता है। इसमें #defines और consts दोनों के सभी फायदे हैं लेकिन केवल पूर्णांक स्थिरांक के लिए काम करता है।
enum
{
MY_INT_CONST = 12345,
};
अंत में, कौन सा तरीका अधिक कुशल और / या अधिक सुरक्षित है?
#defineहालांकि सिद्धांत में अधिक कुशल है, जैसा कि मैंने कहा, आधुनिक संकलक शायद यह सुनिश्चित करते हैं कि थोड़ा अंतर है। #defineइसमें अधिक सुरक्षित है कि इसे असाइन करने का प्रयास करने के लिए हमेशा एक संकलक त्रुटि होती है
#define FOO 5
FOO = 6;
constसंकलक चेतावनी जारी कर सकता है, हालांकि सौंपा जा रहा है में धोखा दिया जा सकता है:
const int FOO = 5;
(int) FOO = 6;
प्लेटफ़ॉर्म के आधार पर, असाइनमेंट अभी भी रन टाइम पर विफल हो सकता है यदि स्थिर को केवल एक सेगमेंट में रखा जाता है और यह सी मानक के अनुसार आधिकारिक रूप से अपरिभाषित व्यवहार है।
व्यक्तिगत रूप से, पूर्णांक स्थिरांक के लिए, मैं हमेशा enumअन्य प्रकार के स्थिरांक के लिए एस का उपयोग करता हूं, मैं constतब तक उपयोग करता हूं जब तक मेरे पास बहुत अच्छा कारण नहीं है।