"Char s [static 10]" जैसे फ़ंक्शन के सरणी पैरामीटर में स्थिर कीवर्ड का उद्देश्य क्या है?


144

कुछ स्रोत कोड ब्राउज़ करते समय मैं इस तरह से एक फ़ंक्शन में आया था:

void someFunction(char someArray[static 100])
{
    // do something cool here
}

कुछ प्रयोग से यह प्रतीत होता है कि अन्य क्वालिफायर भी वहाँ दिखाई दे सकते हैं:

void someFunction(char someArray[const])
{
    // do something cool here
}

ऐसा प्रतीत होता है कि [ ]जब किसी फ़ंक्शन के पैरामीटर के रूप में ऐरे को घोषित किया जाता है , तो क्वालीफायर की अनुमति होती है। ये क्या करते हैं? यह फ़ंक्शन मापदंडों के लिए अलग क्यों है?

जवाबों:


127

पहला घोषणा संकलक को बताता someArrayहै जो कम से कम 100 तत्व लंबा है। यह अनुकूलन के लिए इस्तेमाल किया जा सकता है। उदाहरण के लिए, यह भी मतलब है कि someArrayकभी नहीं है NULL

ध्यान दें कि जब फ़ंक्शन को कॉल इन आवश्यकताओं को पूरा नहीं करता है, तो सी मानक को संकलक की आवश्यकता नहीं है (यानी, यह चुप अपरिभाषित व्यवहार है)।

दूसरी घोषणा केवल कांस्टेबल के रूप में घोषित की गई है someArray( someArrayतत्व नहीं!), यानी आप लिख नहीं सकते someArray=someOtherArray। यह वैसा ही है जैसे कि पैरामीटर था char * const someArray

यह वाक्य विन्यास केवल अंतरतम के भीतर प्रयोग करने योग्य है []एक फ़ंक्शन पैरामीटर सूची में एक सरणी के के ; अन्य संदर्भों में इसका कोई अर्थ नहीं होगा।

मानक पाठ, जिसमें उपरोक्त दोनों मामले शामिल हैं, C11 6.7.6.3/7 (C99 में 6.7.5.3/7 था):

'' प्रकार की सरणी '' के रूप में एक पैरामीटर की घोषणा को '' योग्य पॉइंटर टू टाइप '' में समायोजित किया जाएगा, जहां टाइप क्वालिफायर (यदि कोई हो) सरणी प्रकार के व्युत्पत्ति के भीतर [और भीतर निर्दिष्ट किए गए हैं ]। कीवर्ड स्थिर भी दिखाया जाता है [और] सरणी प्रकार व्युत्पत्ति की, तो कार्य करने के लिए प्रत्येक कॉल के लिए, इसी वास्तविक तर्क का मूल्य एक सरणी के पहले तत्व के उपयोग के साथ कई तत्वों के रूप में कम से कम के रूप में द्वारा निर्दिष्ट प्रदान करेगा आकार अभिव्यक्ति।


35
इस विषय पर: मुझे आश्चर्य है कि अगर इसे उन कार्यों के लिए हस्ताक्षर int foo(struct bar [static 1]);के int foo(struct bar *);रूप में उपयोग करने के लिए बेहतर माना जाना चाहिए जो NULL पॉइंटर्स को स्वीकार नहीं करते हैं। (मुझे पता है कि gcc के पास ऐसे कार्यों को चिह्नित करने के लिए एक वैकल्पिक अमानक सिंटैक्स है ताकि कंपाइलर चेतावनी दे सके ..)
R .. GitHub STOP HELPING ICE

2
मैंने अभी gcc और क्लैग की जाँच की है और न ही यह मान लिया है कि someArray हमेशा नॉन नल होता है जब मैं उनसे 0. के विरुद्ध तुलना करने के लिए कहता हूं। इसके अलावा मैं C99 में सटीक क्लॉज़ खोजने के लिए संघर्ष करता हूँ जो इसे परिभाषित करता है। 6.7.5.3-21 में एक नोट है जिसमें इच्छित अर्थ का उल्लेख है और यह बात है। मुझे संदेह है कि हम इस पर भरोसा कर सकते हैं। इसके अलावा, यह सब फंक्शन सिग्नेचर का हिस्सा नहीं है, इसलिए इसमें बहुत कुछ नहीं है जो हम इसके माध्यम से लागू करते हैं।
नॉर्डिक मेनफ्रेम

5
यह लिंक सड़ा हुआ प्रतीत होता है, क्या यह इशारा कर रहा है? pic.dhe.ibm.com/infocenter/zos/v1r12/…
रॉस ऐकेन

13
@NordicMainframe: यह कुछ समय रहा है, लेकिन clangअब का मौजूदा संस्करण सही ढंग से चेतावनी देता है जब आप एक [static 1]पैरामीटर घोषणा के साथ एक फ़ंक्शन के लिए एक ज्ञात-पूर्ण तर्क को पारित करने का प्रयास करते हैं ।
ड्रीमलैक्स

1
@CiroSantilli 巴拿馬 文件 ill ill be if (!someArray) { somecode... }को हटाया जा सकता है
MM
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.