constइसका मतलब है कि चर को c कोड द्वारा संशोधित नहीं किया जा सकता है, ऐसा नहीं है कि यह बदल नहीं सकता है। इसका अर्थ है कि कोई भी निर्देश चर को नहीं लिख सकता है, लेकिन इसका मूल्य अभी भी बदल सकता है।
volatileइसका मतलब है कि चर किसी भी समय बदल सकता है और इस प्रकार कोई भी संचित मूल्यों का उपयोग नहीं किया जा सकता है; चर की प्रत्येक पहुंच को उसके मेमोरी पते पर क्रियान्वित किया जाना है।
चूँकि प्रश्न "एम्बेडेड" टैग किया गया है और इसे दबाने tempवाला एक उपयोगकर्ता घोषित चर है, न कि हार्डवेयर-संबंधी रजिस्टर (क्योंकि ये आमतौर पर एक अलग। H फ़ाइल में संभाला जाता है), पर विचार करें:
एक एम्बेडेड प्रोसेसर जिसमें अस्थिर वाष्प-लेखन डेटा मेमोरी (RAM) और गैर-वाष्पशील रीड-ओनली डेटा मेमोरी होती है, उदाहरण के लिए वॉन-न्यूमैन आर्किटेक्चर में FLASH मेमोरी, जहां डेटा और प्रोग्राम स्पेस एक साझा डेटा और एड्रेस बस साझा करते हैं।
यदि आप const tempएक मान होने की घोषणा करते हैं (कम से कम यदि 0 से अलग है), तो संकलक चर को FLASH स्थान के एक पते पर असाइन करेगा, क्योंकि भले ही वह RAM पते को सौंपा गया हो, लेकिन प्रारंभिक मूल्य को संग्रहीत करने के लिए उसे अभी भी फ़्लैश मेमोरी की आवश्यकता है वैरिएबल, रैम को बनाते हुए अंतरिक्ष की बर्बादी करता है क्योंकि सभी ऑपरेशन केवल-पढ़ने के लिए होते हैं।
परिणामस्वरूप:
int temp;एक वैरिएबल है RAM में, स्टार्टअप पर 0 से शुरू हुआ (cstart), कैश्ड मान का उपयोग किया जा सकता है।
const int temp;संकलक समय में 0 पर आरंभीकृत (पढ़ें- ony) FLASH में संग्रहीत एक चर है, कैश्ड मान का उपयोग किया जा सकता है।
volatile int temp; एक वैरिएबल है RAM में, स्टार्टअप पर 0 से आरंभ किया गया (cstart), कैश्ड मान का उपयोग नहीं किया जाएगा।
const volatile int temp; संकलक समय में 0 में आरंभीकृत (पढ़ें- ony) FLASH में संग्रहीत एक चर है, कैश्ड मान का उपयोग नहीं किया जाएगा
यहाँ उपयोगी भाग आता है:
आजकल अधिकांश एंबेडेड प्रोसेसर में एक विशेष फ़ंक्शन मॉड्यूल के माध्यम से अपनी रीड-ओनली वाष्पशील मेमोरी में बदलाव करने की क्षमता होती है, जिसमें const int tempरनटाइम में केस को बदला जा सकता है, सीधे तौर पर नहीं। एक अन्य तरीके से कहा, एक फ़ंक्शन उस पते पर मूल्य को संशोधित कर सकता है जहां tempसंग्रहीत है।
एक व्यावहारिक उदाहरण tempडिवाइस सीरियल नंबर के लिए उपयोग करना होगा । पहली बार एम्बेडेड प्रोसेसर चलता है, temp0 (या घोषित मूल्य) के बराबर होगा और एक फ़ंक्शन इस तथ्य का उपयोग उत्पादन के दौरान एक परीक्षण चलाने के लिए कर सकता है और यदि सक्सेफुल, एक सीरियल नंबर सौंपा जा सकता है और इसके tempमाध्यम से मूल्य को संशोधित कर सकता है एक विशेष समारोह के। कुछ प्रोसेसरों के पास ओटीपी (वन-टाइम प्रोग्रामेबल) मेमोरी के साथ एक विशेष पता सीमा होती है।
लेकिन यहाँ अंतर आता है:
यदि const int tempएक बार के प्रोग्रामयोग्य सीरियल नंबर के बजाय एक परिवर्तनीय आईडी है और घोषित नहीं किया गया है volatile, तो एक कैश किया हुआ मूल्य अगले बूट को पूरा नहीं किया जा सकता है, जिसका अर्थ है कि नई आईडी अगले रिबूट को वैध नहीं हो सकती है, या इससे भी बदतर हो सकती है, कुछ फ़ंक्शन नए मूल्य का उपयोग कर सकते हैं, जबकि अन्य पुराने कैश्ड मान का उपयोग कर सकते हैं जब तक कि रिबूट न हो। यदि const int tempआईएस घोषित किया जाता है voltaile, तो आईडी परिवर्तन तुरंत प्रभावी होगा।
const volatile int temp;ब्लॉक स्कोप (यानी अंदर{ }) का उपयोग नहीं करेंगे, इसका वहां कोई उपयोग नहीं है।