C99 एक समारोह पैरामीटर (केवल समारोह परिभाषा सार्थक, नहीं घोषणा) में static जोड़ा गया है:संकलन समय पर [स्थिर एन] लागू क्यों नहीं किया जाता है?
void func(int a[static 10])
{
if (a == NULL)
{ /* this branch can be optimized out */ }
printf("%d", a[-1]); /* causes UB */
}
हालांकि, इसका अर्थ एक अर्थ के रूप में सी 11 6.7.6.3/7 में परिभाषित किया गया है, न कि एक बाधा, जिसका अर्थ यह है कि यदि फ़ंक्शन को गलत तरीके से बुलाया जाता है तो संकलक को डायग्नोस्टिक जारी नहीं करना चाहिए। वास्तव में संकलक निरस्त संकलन नहीं होना चाहिए जबतक कि यह साबित न हो कि सभी शाखाओं में यूबी का कारण बनता है। उदाहरण के लिए:
int main()
{
func(NULL); // UB
int b[9];
func(b); // UB
}
मानक ने इसे बाधा क्यों नहीं बनाया (इसलिए निदान की आवश्यकता है)?
माध्यमिक प्रश्न: फ़ंक्शन हस्ताक्षर का हिस्सा होने के बजाय प्रोटोटाइप (6.7.6.3/13) में static
क्यों अनदेखा किया गया है? यह प्रोटोटाइप को शामिल करने की अनुमति देने के लिए भ्रामक लगता है लेकिन फ़ंक्शन बॉडी नहीं करता है, और इसके विपरीत।
'int * p = create_array(); func (पी); 'आप इसका निदान कैसे करते हैं? –
q2 के रूप में, सरणी घोषणाकर्ता में 'स्थिर 'भंडारण-श्रेणी विनिर्देशक नहीं है, इसलिए 6.7.6.3/13 लागू नहीं होता है। सी एफ 6.7.6.3/2 - "पैरामीटर घोषणा में होने वाला एकमात्र स्टोरेज-क्लास विनिर्देशक 'रजिस्टर' है।" –
@ टीटी पुनः। q2: ठीक है, तो क्या इसका मतलब यह प्रोटोटाइप में वास्तव में महत्वपूर्ण है? –