संपादित करें: सूक्ष्मता एक उत्कृष्ट उत्तर देती है जो यहां मेरे कुछ बिंदुओं को सही करती है, विशेष रूप से स्मृति उपयोग के बारे में।
जैसा कि आप पहचान चुके हैं, कुछ ऐसी स्थितियाँ हैं जहाँ आप एक का उपयोग करने के लिए मजबूर हैं #define
, क्योंकि कंपाइलर एक const
चर की अनुमति नहीं देगा । इसी तरह, कुछ स्थितियों में आपको चर का उपयोग करने के लिए मजबूर किया जाता है, जैसे कि जब आपको मूल्यों की एक सरणी की आवश्यकता होती है (यानी आपके पास सरणी नहीं हो सकती #define
)।
हालाँकि, कई अन्य स्थितियाँ हैं जहाँ आवश्यक रूप से एक भी 'सही' उत्तर नहीं है। यहां कुछ दिशानिर्देश दिए गए हैं जिनका मैं पालन करूंगा:
प्रकार की सुरक्षा
एक सामान्य प्रोग्रामिंग बिंदु से देखने के लिए, const
चर आमतौर पर बेहतर होते हैं (जहां संभव हो)। इसका मुख्य कारण टाइप-सेफ्टी है।
A #define
(प्रीप्रोसेसर मैक्रो) सीधे कोड में प्रत्येक स्थान पर शाब्दिक मूल्य को कॉपी करता है, जिससे प्रत्येक उपयोग स्वतंत्र हो जाता है। यह काल्पनिक रूप से अस्पष्टता का परिणाम हो सकता है, क्योंकि इसका उपयोग कैसे / कहां किया जाता है, इसके आधार पर प्रकार अलग-अलग हल हो सकते हैं।
एक const
चर केवल एक प्रकार का होता है, जो इसकी घोषणा से निर्धारित होता है, और आरंभीकरण के दौरान हल किया जाता है। इसे अलग-अलग व्यवहार करने से पहले अक्सर एक स्पष्ट कलाकारों की आवश्यकता होगी (हालांकि विभिन्न परिस्थितियां हैं जहां इसे सुरक्षित रूप से टाइप-प्रमोशन किया जा सकता है)। बहुत कम से कम, कंपाइलर (यदि सही तरीके से कॉन्फ़िगर किया गया है) एक प्रकार की समस्या होने पर अधिक विश्वसनीय चेतावनी का उत्सर्जन कर सकता है।
इसके लिए एक संभावित समाधान एक स्पष्ट कलाकारों या एक प्रकार के प्रत्यय को शामिल करना है #define
। उदाहरण के लिए:
#define THE_ANSWER (int8_t)42
#define NOT_QUITE_PI 3.14f
यह दृष्टिकोण संभावित रूप से कुछ मामलों में वाक्यविन्यास समस्याओं का कारण बन सकता है, हालांकि यह कैसे उपयोग किया जाता है पर निर्भर करता है।
मेमोरी का उपयोग
सामान्य उद्देश्य कंप्यूटिंग के विपरीत, मेमोरी स्पष्ट रूप से एक प्रीमियम पर होती है जब एक Arduino जैसी किसी चीज के साथ व्यवहार किया जाता है। const
वैरिएबल बनाम का उपयोग करने से #define
यह प्रभावित हो सकता है कि डेटा मेमोरी में कहाँ संग्रहीत है, जो आपको एक या दूसरे का उपयोग करने के लिए मजबूर कर सकता है।
const
चर (आमतौर पर) SRAM में संग्रहीत किए जाएंगे, अन्य सभी चर के साथ।
- शाब्दिक मूल्यों का उपयोग
#define
अक्सर स्केच के साथ प्रोग्राम स्पेस (फ्लैश मेमोरी) में किया जाता है।
(ध्यान दें कि विभिन्न चीजें हैं जो वास्तव में कैसे और जहां कुछ संग्रहीत की जाती हैं, जैसे संकलक विन्यास और अनुकूलन को प्रभावित कर सकती हैं।)
SRAM और Flash की अलग-अलग सीमाएँ हैं (उदाहरण के लिए क्रमशः 2 KB और 32 KB)। कुछ अनुप्रयोगों के लिए, SRAM से बाहर भागना काफी आसान है, इसलिए यह कुछ चीजों को फ्लैश में स्थानांतरित करने में मददगार हो सकता है। रिवर्स भी संभव है, हालांकि शायद कम आम है।
PROGMEM
प्रोग्राम स्पेस (फ़्लैश) में डेटा संग्रहीत करते समय टाइप-सेफ्टी का लाभ प्राप्त करना संभव है। यह PROGMEM
कीवर्ड का उपयोग करके किया जाता है । यह सभी प्रकारों के लिए काम नहीं करता है, लेकिन आमतौर पर इसका उपयोग पूर्णांक या स्ट्रिंग्स के सरणियों के लिए किया जाता है।
में दिया गया सामान्य रूप प्रलेखनरूप इस प्रकार हैं:
dataType variableName[] PROGMEM = {dataInt0, dataInt1, dataInt3...};
स्ट्रिंग टेबल कुछ अधिक जटिल हैं, लेकिन प्रलेखन में पूरी जानकारी है।