मुझे यह लाइन मेरी कार्य परियोजना में मिली, लेकिन मैं इसे समझ नहीं पा रहा हूं:

extern const volatile uint8 * const volatile array[];

क्या आप कृपया मुझे लाइन समझाने में मदद कर सकते हैं?

-5
Phạm Hồng Sơn 12 अक्टूबर 2018, 15:19

1 उत्तर

सबसे बढ़िया उत्तर

सबसे पहले, क्वालीफायर को छोड़कर:

uint8 *array[];

array अनिर्दिष्ट आकार की एक सरणी है जिसके तत्व uint8 * प्रकार के हैं। दूसरे शब्दों में, uint8 के लिए पॉइंटर्स की एक सरणी।

यदि यह घोषणा किसी फ़ंक्शन के पैरामीटर के रूप में प्रकट होती है, तो सरणी सिंटैक्स वास्तव में एक पॉइंटर के लिए शॉर्टहैंड है। यदि यह एक फ़ंक्शन पैरामीटर नहीं है और फ़ाइल स्कोप पर घोषित किया गया है तो यह अस्थायी परिभाषा के रूप में कार्य करता है। एक पूर्ण परिभाषा कोड में कहीं और हो सकती है जो आकार और वैकल्पिक रूप से एक प्रारंभकर्ता निर्दिष्ट करती है। यदि कोई अन्य पूर्ण परिभाषा मौजूद नहीं है, तो सरणी को 1 तत्व के रूप में परिभाषित किया गया है।

क्वालिफायर के साथ डिक्लेरेशन का क्या मतलब है, इसके बारे में बात करने से पहले, आइए पहले बात करते हैं कि उन क्वालिफायर्स का क्या मतलब है।

const क्वालिफायर कोड को नामित ऑब्जेक्ट को संशोधित करने से रोकता है। इस घोषणा को देखते हुए:

const int x;

इसका मतलब है कि x को उदाहरण के लिए x = 1 का उपयोग करके संशोधित नहीं किया जा सकता है। शामिल पॉइंटर्स के साथ यह थोड़ा और मुश्किल है:

const int *x;

यह x को const int के सूचक के रूप में परिभाषित करता है। इसका मतलब है कि आप x को संशोधित कर सकते हैं, लेकिन यह नहीं कि यह किस ओर इशारा करता है। तो x = &y कानूनी है लेकिन *x = 1 नहीं है।

int * const x;

यह x को const सूचक के रूप में int के रूप में परिभाषित करता है, जिसका अर्थ है कि आप x को संशोधित नहीं कर सकते हैं, लेकिन आप संशोधित कर सकते हैं कि यह क्या इंगित करता है। तो x = &y कानूनी नहीं है लेकिन *x = 1 है।

const int * const x;

यह x को const सूचक के रूप में const int के रूप में परिभाषित करता है। तो इस मामले में, न तो x और न ही जो इंगित करता है उसे संशोधित किया जा सकता है।

const int * const x[];

यहाँ, x एक सरणी है जिसके तत्व const const int के सूचक हैं। जैसा कि पिछले उदाहरण में है, प्रत्येक सरणी तत्व के लिए, न तो सरणी तत्व और न ही वह जो इंगित करता है उसे संशोधित किया जा सकता है।

अब बात करते हैं volatile की। यह क्वालीफायर संकलक को बताता है कि प्रश्न में चर अप्रत्याशित रूप से बदल सकता है। C मानक:

एक वस्तु जिसमें अस्थिर-योग्य प्रकार है, को संशोधित किया जा सकता है कार्यान्वयन के लिए अज्ञात तरीके या अन्य अज्ञात पक्ष हैं प्रभाव। इसलिए ऐसी वस्तु का उल्लेख करने वाला कोई भी व्यंजक सार मशीन के नियमों के अनुसार कड़ाई से मूल्यांकन किया जा सकता है, जैसा कि 5.1.2.3 में वर्णित है। इसके अलावा, प्रत्येक अनुक्रम बिंदु पर वस्तु में अंतिम रूप से संग्रहीत मूल्य उसके द्वारा निर्धारित के साथ सहमत होगा अमूर्त मशीन, अज्ञात कारकों द्वारा संशोधित को छोड़कर पहले उल्लेख किया है। 134) किसी तक पहुंच का क्या अर्थ है ऑब्जेक्ट जिसमें अस्थिर-योग्य प्रकार है कार्यान्वयन-परिभाषित

१३४) किसी वस्तु का वर्णन करने के लिए volatile घोषणा का उपयोग किया जा सकता है मेमोरी-मैप्ड इनपुट/आउटपुट पोर्ट या ऑब्जेक्ट के अनुरूप एसिंक्रोनस रूप से इंटरप्टिंग फ़ंक्शन द्वारा एक्सेस किया गया। कार्रवाई घोषित वस्तुओं पर एक द्वारा "अनुकूलित" नहीं किया जाएगा के लिए नियमों द्वारा अनुमत के अलावा कार्यान्वयन या पुन: व्यवस्थित किया गया भावों का मूल्यांकन

इसका मतलब यह है कि एक volatile वस्तु उन तरीकों से बदल सकती है जो संकलक को ज्ञात नहीं हैं, और इस प्रकार संकलक को इस चर पर कोई अनुकूलन नहीं करना चाहिए और वास्तव में मान लेना चाहिए कि मान बाहरी रूप से बदल दिया गया था।

अब अपनी पूरी घोषणा पर आगे बढ़ते हैं:

const volatile uint8 * const volatile array[];

यह array को अनिर्दिष्ट आकार की एक सरणी के रूप में घोषित करता है जिसके तत्व uint8 * प्रकार के होते हैं, जहां सरणी के तत्वों को प्रोग्राम द्वारा संशोधित नहीं किया जा सकता है (यानी const) लेकिन बाहरी रूप से संशोधित किया जा सकता है (यानी volatile), और जो सरणी तत्व इंगित करते हैं उन्हें भी प्रोग्राम द्वारा बदला नहीं जा सकता है, लेकिन बाहरी रूप से संशोधित किया जा सकता है।

3
dbush 12 अक्टूबर 2018, 13:36