2014-09-17 3 views
12

सी मानक कहता है कि परिवर्तनीय नाम मानक सी कीवर्ड और मानक फ़ंक्शन नामों से मेल नहीं खाते हैं। फिर नीचे दिए गए कोड में कोई त्रुटि नहीं है?मुख्य और fopen वैध चर नाम हैं?

#include <stdio.h> 

int main() 
{ 
    int main = 10; 
    printf("Magic is %d", main); 
    return 0; 
} 

ouah लिखते भी http://codepad.org/OXk4lZZE

देखें नीचे एक answer में,

main एक आरक्षित पहचानकर्ता नहीं है और यह सी

में
main जैसा कि नाम से चर करने की अनुमति है

इसलिए नीचे दिए गए कार्यक्रम पर विचार करते हुए, था टी मतलब है कि fopen इसी प्रकार आरक्षित नहीं है?

#include <stdio.h> 

int main() 
{ 
    int fopen = 10; 
    printf("Magic is %d", fopen); 
    return 0; 
} 
+9

सी मानक lotsa बातें ... कहते हैं की जाँच करने के –

+1

दिलचस्प है, पूरी अवधारणा इंटरनेशनल में एक जोएर्ड Mullender द्वारा 1984 में नियुक्त किया गया था "एक वैश्विक चर के रूप में मुख्य" Obfuscated सी कोड प्रतियोगिता। इसे देखें [यहां] (http://ioccc.org/1984/mullender.c)। – SevenBits

उत्तर

32

आप प्रोग्राम एक वैध सी प्रोग्राम है।

main एक आरक्षित पहचानकर्ता नहीं है और यह सी में main जैसा कि नाम से चर करने की अनुमति है

क्या आप ऐसा नहीं कर सकते फ़ाइल दायरे में एक चर main नाम है लेकिन यह अन्य चर कि संघर्ष होगा साथ के रूप में ही है एक ही नाम के एक समारोह के साथ:

यह मान्य नहीं है:

int main = 0; 

int main(void) 
{ 
} 

एक ही कारण के लिए यह मान्य नहीं है:

+०१२३५१६४१०६
int foo = 0; 

int foo(void) 
{ 
    return 0; 
} 

संपादित करें: ओपी प्रश्न संपादित संबोधित करने के लिए, ओपी प्रश्न में दूसरा कार्यक्रम भी मान्य है सी कहते हैं

(सी 11, 7.1.3p1) "किसी भी बाहरी लिंकेज के साथ सभी पहचानकर्ता निम्नलिखित उपखंडों (भविष्य की लाइब्रेरी दिशानिर्देशों सहित) और इरनो को हमेशा बाहरी लिंकेज के साथ पहचानकर्ता के रूप में उपयोग के लिए आरक्षित किया जाता है। "

लेकिन fopen परिवर्तनीय पहचानकर्ता के पास ब्लॉक क्षेत्र और उदाहरण प्रोग्राम में कोई संबंध नहीं है।

+1

यह भी ध्यान रखें कि क्योंकि आप ' 'शामिल हैं,' fopen' फ़ंक्शन-शैली मैक्रो हो सकता है। फिर यह कुछ प्रकार के चर के रूप में पोर्टेबल ("कड़ाई से अनुरूप") नहीं होगा, विशेष रूप से एक फ़ंक्शन पॉइंटर जिसे आप 'फॉपेन (जो भी)' कहते हैं, क्योंकि इससे मैक्रो का विस्तार होगा।यह एक वैरिएबल नाम के रूप में काम करेगा बशर्ते कार्यान्वयन ने इसे मैक्रो के रूप में परिभाषित नहीं किया है, या यदि आप '(', 'से पहले वैरिएबल नाम कभी नहीं लिखते हैं, तो यह पोर्टेबिलिटी का काफी अच्छा बिंदु है ... –

+0

यह अलग है तथ्य जो आप पहले ही देते हैं, वह मानक लाइब्रेरी फ़ंक्शन नाम बाहरी लिंकेज के उपयोग के लिए आरक्षित हैं, क्योंकि उस लिंकेज नियम लागू होते हैं, भले ही आपने कभी भी प्रासंगिक शीर्षलेख शामिल न किया हो। और आरक्षित पहचानकर्ताओं से परामर्श करने के अलावा किसी भी माध्यम से विश्वसनीय रूप से काम नहीं किया जा सकता और "भविष्य के दिशानिर्देश"। –

+0

@ स्टेवजेसॉप यह एक दिलचस्प बिंदु है, टिप्पणी के लिए धन्यवाद। ओपी के उदाहरण में 'फॉपेन' के साथ 'int' के रूप में घोषित किया गया तथ्य यह है कि 'fopen' को फ़ंक्शन-जैसी मैक्रो के रूप में परिभाषित किया जा सकता है हेडर में कोई घटना नहीं है। लेकिन फ़ंक्शन-पॉइंटर प्रकार और पॉइंटर को कॉल के साथ एक अलग उदाहरण वास्तव में समस्याग्रस्त होगा। – ouah

1

डिफ़ॉल्ट रूप से वैश्विक चर और फ़ंक्शन extern प्रकृति में हैं जहां ब्लॉक स्कोप में वे auto डिफ़ॉल्ट रूप से हैं।

कैसे लिंकर निराकरण प्रतीकों की जांच कर here

संबंधित मुद्दे