एक C11 पार्सर (शैक्षिक उद्देश्यों के लिए) को लागू करने की कोशिश में, मैंने पाया कि C11 (p. 470) में बल्कि में C99 (p. 412) (धन्यवाद जोहान्स!), प्रत्यक्ष declarator परिभाषित किया गया है के रूप में:सी में "[*]" (स्टार संशोधक) का क्या अर्थ है?
(6.7.6) direct-declarator:
direct-declarator [ type-qualifier-list? * ]
सबसे पहले, मैं सोचा कि यह व्याकरण में एक त्रुटि थी (प्रकार सूची वैकल्पिक नहीं होनी चाहिए)।
int array[*] = { 1, 2, 3 };
// error: star modifier used outside of function prototype
तो जाहिरा तौर पर, (बजना में) इस स्टार संशोधक कहा जाता है: हालांकि, जब मैं यह मेरी संदर्भ संकलक (बजना) में बाहर की कोशिश की, मैं एक नहीं बल्कि अप्रत्याशित त्रुटि मिली।
मैं जल्दी से सीखा है कि वे केवल समारोह हस्ताक्षर में इस्तेमाल किया जा सकता है:
void foobar(int array[*])
हालांकि, वे केवल घोषणा में इस्तेमाल किया जा सकता। साथ ही एक त्रुटि में एक समारोह परिभाषा परिणामों में इसका इस्तेमाल करने की कोशिश कर रहा है:
void foobar(int array[*]) {
// variable length array must be bound in function definition
}
तो जहाँ तक मैं बता सकता हूँ, अभिप्रेत व्यवहार समारोह घोषणा में [*]
उपयोग करना और फिर एक निश्चित संख्या का उपयोग करने के लिए है समारोह परिभाषा में।
// public header
void foobar(int array[*]);
// private implementation
void foobar(int array[5]) {
}
हालांकि, मैं यह कभी नहीं देखा है और मैं काफी या तो यह करने के उद्देश्य समझ में नहीं आता।
- इसका उद्देश्य क्या है, इसे क्यों जोड़ा गया था?
int[]
के साथ क्या अंतर है?int *
के साथ क्या अंतर है?
यह सी 99 के बाद से सी में रहा है। मेरा मानना है कि इसका मतलब है "यहां वीएलए नंबर के लिए प्लेसहोल्डर"। 'int [] []' मान्य नहीं है, लेकिन 'int [] [*] 'है (एक गैर-परिभाषित फ़ंक्शन प्रोटोटाइप में)। –
आप सही हैं, मैं इसका उल्लेख करना भूल गया लेकिन मैंने त्रुटियों की खोज की जो मुझे क्लैंग से मिलीं और वे अपने वीएलए यूनिट टेस्ट सूट से मेल खाते थे। फिर भी, मैं उनके उद्देश्य को जानना चाहता हूं। धन्यवाद! – elslooo
22 विचार और यह "सी स्टार संशोधक" के लिए पहले से ही पहला Google परिणाम है। आपने एक अस्पष्ट सुविधा पर मारा है। – ApproachingDarknessFish