सबसे पहले: उत्तर खोजते समय, मुझे क्षेत्रों को खोजने के लिए [टैग] करने की अनुमति है। इस पोस्टिंग इंटरफ़ेस को भी इसका समर्थन करना चाहिए।

त्रुटि जाँच के अलावा, जिसके लिए केवल प्रकारों की आवश्यकता होती है, पहचानकर्ताओं की नहीं, ऐसे कौन से व्यावहारिक अनुप्रयोग हैं जिनका सामना फ़ंक्शन प्रोटोटाइप स्कोप का लाभ उठाने के लिए किया जा सकता है? इसके कुछ फायदे क्या हैं?

function(int index, float array[index]);
//function prototype with names

बनाम

function(int, float);
//function prototype(without identifiers)...

किसी फ़ंक्शन की परिभाषा में हमेशा प्रकार और नामों सहित रिटर्न तर्क, फ़ंक्शन नाम और फ़ंक्शन तर्क शामिल होते हैं ऐसा लगता है कि प्रोटोटाइप स्कोप अनावश्यक होगा क्योंकि तर्क नामों के साथ फिर से घोषित किए जाते हैं:

प्रोटोटाइप: return_type return_name(argument_type, ...);

समारोह घोषणा:

return_type return_name(argument_type argument_name, ...){
    compound_statement_function_block;
}

एकमात्र मूल्य जो मैं देख सकता हूं वह यह है कि यह फ़ाइल स्कोप नेमस्पेस के भीतर फ़ंक्शन नाम सुरक्षित रखता है जिसका अर्थ है कि फ़ंक्शन नाम प्रोटोटाइप के भीतर उपयोग किया जा सकता है:

int func(int func);    //Proto type declaration. Compiler allows this
                       //but throws warning about func() redeclaration
                       //but nothing about the arguments.

int function(int function){
    int function;
}

मैंने मूल रूप से सोचा था कि दायरा नामों से स्वतंत्र था जिसका अर्थ है file_scope_variable_name file_scope_function_name से अलग था। वे प्रासंगिक और महत्वपूर्ण रूप से इस तरह के होने के लिए काफी भिन्न हैं और मैंने सोचा कि मानक जिसे कहा जाता है, हालांकि मैं जिस कंपाइलर का उपयोग कर रहा हूं, जीसीसी, इसकी अनुमति नहीं देगा। हालांकि यह किसी भी दायरे में संरचना/संघ नाम स्थान में एक टैग के रूप में मुख्य पुन: घोषित की अनुमति देगा क्योंकि वे एक फ़ंक्शन की तरह एक ब्लॉक तत्व हैं:

int func(int func){
    typedef struct {
        int func;
    };                 //Cannot use func as a variable name at function scope 
                       //since it is an argument even though 
                       //this is within a different namespace
    typedef union func{
        int (*func)(int func); //Shows func() name and arg. names
                               //are different namespaces.
        union u{
            int func;
            //...
        }
    } ;
}

int main(int main){
    typedef struct main {
        int main;
    };
}

ऐसा लगता है कि 'मुख्य' परिवर्तनीय नामों और फ़ंक्शन नामों के लिए फ़ाइल स्तर पर एक आरक्षित कीवर्ड है लेकिन संरचना/टैग संघ नाम नहीं है। यह फ़ाइल स्तर पर इसे स्वीकार करता है:

struct main {
    int main;
    //...
} not_main;

इसका कोई मतलब नहीं है कि प्रोटोटाइप के लिए नामस्थान ऐसे क्यों हैं। यदि इसकी कुछ व्यावहारिक उपयोगिता नहीं होती, तो यह कोई भेद नहीं होता।

0
user11839113 2 मई 2020, 02:00
एक फ़ंक्शन का वैश्विक दायरा होता है, इसलिए लीवरेजिंग की आवश्यकता नहीं होती है। आप इसे static के रूप में परिभाषित करके इसका लाभ उठा सकते हैं।
 – 
Weather Vane
2 मई 2020, 02:03
आप क्या पूछ रहे हैं यह अस्पष्ट है। क्या आप पूछ रहे हैं कि फ़ंक्शन प्रोटोटाइप में नामित तर्क बनाम अज्ञात तर्कों के बीच अंतर/गुण क्या हैं?
 – 
kaylum
2 मई 2020, 02:05
1
घोषणाएं समान नहीं हैं: पहले में (प्रभावी रूप से) एक float* पैरामीटर है, दूसरे में float है।
 – 
Weather Vane
2 मई 2020, 02:12
1
क्या इससे आपके सवाल का जवाब मिलता है? C फ़ंक्शन प्रोटोटाइप में पैरामीटर का नाम डालें?
 – 
kaylum
2 मई 2020, 02:16
फ़ंक्शन प्रोटोटाइप स्कोप फ़ंक्शन के मापदंडों का दायरा है। पहला उदाहरण इसी से जुड़ा है। दूसरा नहीं है। आपका प्रश्न भ्रमित करने वाला है। स्पष्ट रूप से पहला पैरामीटर एक आकार घोषित करता है और अगली सरणी उस आकार में एक फ़ंक्शन में योग्यता होती है। कंपाइलर पैरामीटर पर टाइप चेकिंग लागू कर सकता है और आप इस तरह से मजबूत फ़ंक्शन विनिर्देश बना सकते हैं।
 – 
Bailey Kocin
2 मई 2020, 02:16

1 उत्तर

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

प्रारंभिक

आप कई अलग-अलग अवधारणाओं को मिला रहे हैं जो C पहचानकर्ताओं पर लागू होती हैं: स्कोप, नाम स्थान, और लिंकेज:

  • स्कोप प्रोग्राम टेक्स्ट का वह क्षेत्र है जहां किसी पहचानकर्ता और किसी विशेष प्रोग्राम निकाय के बीच दिया गया जुड़ाव दिखाई देता है और उसका उपयोग किया जा सकता है।

  • नेमस्पेस इस तथ्य का वर्णन करता है कि C समान पहचानकर्ता को कुछ प्रासंगिक रूप से अलग-अलग श्रेणियों में वस्तुओं की पहचान करने के लिए समान दायरे में उपयोग करने की अनुमति देता है: लेबल, टैग, संरचना और संघ के सदस्य, और बाकी सब कुछ।

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

दायरा और जुड़ाव काफी हद तक अलग-अलग विचार हैं। सामान्य पहचानकर्ताओं की फ़ाइल स्कोप घोषणाओं में बाहरी या आंतरिक संबंध हो सकते हैं। सामान्य पहचानकर्ताओं की ब्लॉक स्कोप घोषणाओं में बाहरी लिंकेज या कोई लिंकेज नहीं हो सकता है। अन्य नामस्थान में पहचानकर्ताओं की सभी घोषणाओं का कोई संबंध नहीं है।


सवाल

... थोड़ा विस्तृत है, लेकिन मैं मुख्य बिंदुओं पर ध्यान देने की कोशिश करूंगा।

त्रुटि जाँच के अलावा, जिसके लिए केवल प्रकारों की आवश्यकता होती है, पहचानकर्ताओं की नहीं, ऐसे कौन से व्यावहारिक अनुप्रयोग हैं जिनका सामना फ़ंक्शन प्रोटोटाइप स्कोप का लाभ उठाने के लिए किया जा सकता है? इसके कुछ फायदे क्या हैं?

फ़ंक्शन प्रोटोटाइप स्कोप होने से फ़ंक्शन प्रोटोटाइप में पैरामीटर नाम शामिल करना संभव हो जाता है। यदि प्रोटोटाइप फ़ंक्शन पैरामीटर पहचानकर्ताओं के लिए एक दायरा प्रदान नहीं करता है, तो केवल एक ही दायरा जिससे वे संबंधित हो सकते हैं, वह फ़ाइल दायरा होगा, और इसका मतलब यह होगा कि प्रत्येक पैरामीटर नाम फ़ाइल में हर दूसरे से अलग होना चाहिए, और से प्रत्येक फ़ाइल-स्कोप चर का। इसका मतलब यह भी होगा कि फ़ंक्शन पैरामीटर को फ़ंक्शन के बाहर से एक्सेस किया जा सकता है। और निश्चित रूप से एक फ़ंक्शन की कई घोषणाओं के साथ कोई समस्या होगी जो विभिन्न पैरामीटर नाम प्रदान करती है। क्या झंझट है!

यह सच है कि आपको ऐसे प्रोटोटाइप की आवश्यकता नहीं है जो पैरामीटर नाम प्रदान करने के लिए फ़ंक्शन परिभाषाओं का हिस्सा नहीं हैं - आखिरकार, यह वैकल्पिक है। लेकिन इसे अनुमति देना सभी के लिए एक बड़ी सुविधा है। लाभों में से हैं

  • यह अलग प्रोटोटाइप बनाना आसान बनाता है (केवल फ़ंक्शन परिभाषा से एक को लें और फ़ंक्शन बॉडी को हटा दें)
  • यह मानव पाठकों के लिए फ़ंक्शन प्रोटोटाइप को अधिक सार्थक बनाता है, विशेष रूप से पैरामीटर नामों के अच्छे विकल्पों के साथ
  • यह संकलक को अधिक उपयोगी नैदानिक ​​संदेश प्रदान करने की अनुमति देता है

किसी फ़ंक्शन की परिभाषा में हमेशा प्रकार और नामों सहित रिटर्न तर्क, फ़ंक्शन नाम और फ़ंक्शन तर्क शामिल होते हैं ऐसा लगता है कि प्रोटोटाइप स्कोप होने से अनावश्यक होगा क्योंकि तर्क नामों के साथ फिर से घोषित किए जाते हैं

ऐसा लगता है कि आप इसे पीछे की ओर देख रहे हैं। फ़ंक्शन प्रोटोटाइप स्कोप के प्रभावों में से एक यह है कि एक प्रोटोटाइप में पैरामीटर नाम देना बेमानी नहीं है। प्रोटोटाइप को छोड़कर जो फ़ंक्शन परिभाषा का हिस्सा हैं, फ़ंक्शन प्रोटोटाइप में पहचानकर्ता घोषणाओं का दायरा प्रोटोटाइप है। उन्हें किसी दिए गए फ़ंक्शन के एक प्रोटोटाइप से दूसरे से मेल खाने की ज़रूरत नहीं है (हालांकि आमतौर पर वे करते हैं)। फ़ंक्शन बॉडी के लिए मायने रखने वाले एकमात्र पैरामीटर नाम फ़ंक्शन की परिभाषा से जुड़े होते हैं।

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

एकमात्र मूल्य जो मैं देख सकता हूं वह यह है कि यह फ़ाइल स्कोप नेमस्पेस के भीतर फ़ंक्शन नाम सुरक्षित रखता है जिसका अर्थ है कि फ़ंक्शन नाम प्रोटोटाइप के भीतर उपयोग किया जा सकता है

यह करता है इसका प्रभाव है, हालांकि मैं शायद ही कभी किसी फ़ंक्शन के पहचानकर्ता को अपने स्वयं के पैरामीटर के नाम के रूप में उपयोग करता हूं। लेकिन यह थोड़ा अधिक सामान्य है कि फ़ाइल-स्कोप फ़ंक्शन नाम किसी अन्य फ़ंक्शन के पैरामीटर के नाम के रूप में भी प्रकट होता है। या कि फ़ाइल-स्कोप चर नाम फ़ंक्शन पैरामीटर के नाम के रूप में प्रकट होता है।

मैंने मूल रूप से सोचा था कि दायरा नामों से स्वतंत्र था जिसका अर्थ है file_scope_variable_name file_scope_function_name से अलग था।

नहीं, यह नामस्थान का प्रश्न होगा। फ़ंक्शन और चर नाम एक ही नामस्थान (साधारण पहचानकर्ताओं के) से संबंधित हैं, जो उपयुक्त है क्योंकि वे हमेशा संदर्भ से एक दूसरे से अलग नहीं होते हैं।

[मेरा कंपाइलर] हालांकि किसी भी दायरे में संरचना/संघ नाम स्थान में एक टैग के रूप में मुख्य पुन: घोषित की अनुमति देगा क्योंकि वे एक फ़ंक्शन जैसे ब्लॉक तत्व हैं

हां, main को टैग के रूप में इस्तेमाल किया जा सकता है, भले ही बाहरी लिंकेज वाले फ़ंक्शन के पहचानकर्ता होने के बावजूद। और एक लेबल के रूप में और मनमाने ढंग से कई संरचनाओं और यूनियनों के सदस्य के रूप में। ऐसा इसलिए है क्योंकि वे अलग नाम स्थान हैं। नामस्थान कैसे स्थापित किए जाते हैं, इसके लिए एक नियम सीखने की कोशिश करने के बजाय, शायद अलग-अलग नामस्थानों को याद रखना सबसे अच्छा है - उन सभी संरचनाओं और यूनियनों के अलावा, जिन्हें एक श्रेणी के रूप में लिया जा सकता है, केवल तीन हैं।

साथ ही, main का उपयोग किसी फ़ंक्शन प्रोटोटाइप में पैरामीटर नाम के रूप में या किसी फ़ंक्शन के स्थानीय चर के रूप में किया जा सकता है, क्योंकि ऐसे पहचानकर्ताओं का दायरा भिन्न होता है।

और main को एक अलग (फाइल-स्कोप) फ़ंक्शन के नाम के रूप में कई अलग-अलग अनुवाद इकाइयों में इस्तेमाल किया जा सकता है, जब तक कि किसी भी टीयू में एक से अधिक न हो, और बशर्ते कि बिल्कुल एक में पूरे कार्यक्रम में बाहरी लिंकेज है।

0
John Bollinger 6 जुलाई 2021, 03:52
अच्छी जानकारी, धन्यवाद! मुझे f(x) पैरामीटर नाम भेद के रूप में पसंद आया, अच्छा बिंदु कोई फर्क नहीं पड़ता हो सूक्ष्म। संक्षेप में, ऐसा लगता है कि नामस्थान क्या लागू होता है और दायरा कम या ज्यादा कहां लागू होता है। अलग-अलग निकायों के साथ अलग-अलग प्रोटोटाइप बनाने पर, क्या आपका मतलब यह है कि उनके पास एक ही फाइल स्कोप के भीतर अलग-अलग नाम हैं या प्री-प्रोसेसर सशर्त का उपयोग करते हैं यदि अलग-अलग फाइलों में हेडर में एक ही नाम के कार्य होते हैं? आपका क्या मतलब है कि ब्लॉकों में बाहरी जुड़ाव होता है? क्या तीन नाम स्थान संघ, संरचना और एनम सदस्य पहचानकर्ताओं से अलग हैं: लेबल, टैग और साधारण (चर, कार्य)?
 – 
user11839113
2 मई 2020, 07:03
पी.एस. मेरे द्वारा उपयोग किए जा रहे संदर्भ और उदाहरणों के लिए जानकारी का मुख्य स्रोत है "en.cppreference.com/w/c " और सी प्रोग्रामिंग, दूसरा संस्करण। कर्निघन द्वारा। यदि आप एक समकक्ष या बेहतर स्रोत के बारे में जानते हैं तो आप मानक सी के लिए सिफारिश कर सकते हैं, कृपया मुझे बताएं!
 – 
user11839113
2 मई 2020, 07:07
@ pchelper4, हां, यह कहना उचित है कि नेमस्पेसिंग इस बारे में है कि (किस तरह की चीज) नाम दिया गया है, जबकि स्कोप इस बारे में है कि नाम कहां दिखाई देता है। मैंने जो कुछ भी कहा वह सी स्रोत कोड को संदर्भित करता है क्योंकि यह सभी प्रीप्रोसेसिंग के बाद होगा (न केवल सशर्त संकलन बल्कि include प्रसंस्करण और मैक्रो विस्तार)। हां, स्ट्रक्चर और यूनियन सदस्यों के अलावा तीन नामस्थान लेबल, टैग और बाकी सब कुछ हैं। लेकिन नहीं, एनम स्थिरांक सामान्य पहचानकर्ता हैं; enums में सदस्य नहीं हैं।
 – 
John Bollinger
2 मई 2020, 15:58
और मुझे खेद है, लेकिन हम स्पष्ट रूप से और जानबूझकर यहां ऑफ-साइट संसाधनों की सिफारिश करने के व्यवसाय में नहीं हैं।
 – 
John Bollinger
2 मई 2020, 15:59
ठीक धन्यवाद! उस प्रश्न का उत्तर पाने के लिए मैं इस साइट पर कहां जा सकता हूं? एक शौकिया के लिए पैसे के लायक मानक खरीदना है?
 – 
user11839113
2 मई 2020, 16:52