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