"इंट मेन (वॉयोइड)"? वह कैसे काम करता है?


135

मुझे हाल ही में एक छोटे सी परीक्षण कार्यक्रम में टाइप करना पड़ा और, इस प्रक्रिया में, मैंने गलती से उपयोग करके मुख्य फ़ंक्शन में वर्तनी की गलती vooidकी void

और फिर भी इसने काम किया।

इसे अपने सबसे छोटे पूर्ण संस्करण तक कम करते हुए, मैंने इसे समाप्त किया:

int main (vooid) {
    return 42;
}

यह वास्तव में संकलन करता है ( gcc -Wall -o myprog myprog.c) और, जब चलाया जाता है, तो यह 42 देता है।

यह वैध कोड कितना सही है?


यहां एक ट्रांसक्रिप्ट कट और मेरे bashशेल से चिपकाया गया है, जो मैं दिखा रहा हूं:

pax$ cat qq.c
int main (vooid) {
    return 42;
}

pax$ rm qq ; gcc -Wall -o qq qq.c ; ./qq

pax$ echo $?
42

एकल intपैरामीटर के साथ मुख्य को परिभाषित करके , आप अपरिभाषित व्यवहार को लागू करते हैं । कुछ भी हो सकता है :)
pmg

9
असल में, मुझे UB, @pmg के बारे में निश्चित नहीं है। आईएसओ विशेष रूप mainसे मानक दो कैनोनिकल से अन्य संभावनाओं के लिए अनुमति देता है। पोर्टेबिलिटी के लिए, आपको उन दो में से एक का उपयोग करना चाहिए लेकिन मुझे नहीं लगता कि यूबी यहां लागू होता है।
paxdiablo

हम्म: एक मेजबान वातावरण mainमें 2 विहित रूपों (2.1.2.2) में से एक होना चाहिए। लेकिन आप सही @pax हैं, एक मुक्त वातावरण में, पहचानकर्ता mainकिसी भी तरह से विशेष नहीं है: यदि एक फ़ंक्शन के रूप में उपयोग किया जाता है, तो यह किसी भी प्रकार का हो सकता है और किसी भी प्रकार के मापदंडों की संख्या हो सकती है।
दोपहर

2
C99 में, फ्रीस्टैंडिंग पूरी तरह से कार्यान्वयन परिभाषित है। होस्ट किए गए, खंड 5.1.2.2.1 के अंत में "या कुछ अन्य कार्यान्वयन-परिभाषित तरीके से" इसलिए इसे कम से कम, दो विहित रूपों की आवश्यकता होती है, लेकिन दूसरों को भी हो सकता है (यह UNIXy int main (int argc, char *argv[], char *envp[]);के अनुरूप होने की अनुमति देगा) )।
पैक्सडीब्लो

जवाबों:


220

यह बस "पुरानी शैली" फ़ंक्शन-घोषणा सिंटैक्स का उपयोग कर रहा है; आप अव्यवस्थित रूप से एक intपैरामीटर घोषित कर रहे हैं vooid


2
ऐसा ही प्रतीत होता है। यदि आप "वॉयॉयड = 42 जोड़ते हैं; वॉयसॉयड लौटाएं;" मुख्य रूप से, आपको 42 का रिटर्न मान भी मिलता है।
जेफ एम्स

43
आरगघ, तुम सही हो। अगर मैं जोड़ूं -std=c99तो मुझे मिलता है qq.c:1: warning: type of 'vooid' defaults to 'int'
paxdiablo

70

यह मान्य कोड है, क्योंकि myprog.c में शामिल हैं:

int main (vooid) // vooid is of type int, allowed, and an alias for argc
{     
  return 42; // The answer to the Ultimate Question
} 

vooidएक से अधिक तर्कों की संख्या शामिल है (यानी, argc)। इसलिए, आपके द्वारा किए गए प्रभाव में इसका नाम बदलना argcहै vooid


11
यदि आप "वापसी ध्वनि;" इसके बजाय, यह वास्तव में 1 + अंक देता है। आर्ग की।
जेफ एम्स

6
@ जेफ, कार्यक्रम का नाम एक तर्क के रूप में गिना जाता है, इसलिए
मार्टिन बेकेट

23

C में, फ़ंक्शन तर्क के लिए डिफ़ॉल्ट प्रकार है int। तो, आपका प्रोग्राम शब्द vooidको मान रहा है int main(int vooid), जो पूरी तरह से मान्य कोड है।


20

यह केवल gcc -std=c89 -Wall -o qq qq.cऔर gcc -std=gnu89 -Wall -o qq qq.cचेतावनी नहीं है। अन्य सभी मानकों के intलिए निहित प्रकार के बारे में एक चेतावनी का उत्सर्जन करते हैं vooid

int main(chart)जैसा करता है वैसा ही व्यवहार करता है int main (vooid)

return vooid; कमांड लाइन तर्कों की संख्या लौटाता है।

मैंने डेबियन परीक्षण प्रणाली पर gcc 4.4.5 के साथ परीक्षण किया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.