2013-06-01 9 views
25

में अमान्य है I Zed Shaw's Learn C The Hard Way शुरू कर रहा हूं। मैंने एक्सकोड और कमांड लाइन टूल्स डाउनलोड किए हैं। लेकिन जब मैं पहले ही कार्यक्रम संकलन:जीसीसी चेतावनी: फ़ंक्शन 'डाल' की निहित घोषणा C99

int main(int argc, char *argv[]) { 
    puts("Hello world."); 
    return 0; 
} 

मैं इस चेतावनी मिलती है:

ex1.c: 2: 1: चेतावनी: समारोह 'कहते हैं' का अंतर्निहित घोषणा C99 में अमान्य है [-Wimplicit-function-declaration]

प्रोग्राम संकलित और सही तरीके से निष्पादित करता है।

मैं ओएसएक्स 10.8.3 का उपयोग कर रहा हूं। 'gcc -v' दर्ज करना:

अंतर्निहित चश्मे का उपयोग करना। लक्ष्य: i686-apple-darwin11 के साथ कॉन्फ़िगर किया गया: /private/var/tmp/llvmgcc42/llvmgcc42-2336.11~182/src/configure - अक्षम करने योग्य --enable-werror --prefix =/अनुप्रयोग/Xcode.app/सामग्री/डेवलपर /usr/llvm-gcc-4.2 --mandir =/share/man --enable-languages ​​= c, objc, C++, obj-C++ --program-prefix = llvm- --program-transform-name =/^ [सीजी] [^ .-] * $/एस/$/- 4.2/--with-slibdir =/usr/lib --build = i686-apple-darwin11 --enable-llvm =/private/var /tmp/llvmgcc42/llvmgcc42-2336.11~182/dst-llvmCore/Developer/usr/local --program-prefix = i686-apple-darwin11- --host = x86_64-apple-darwin11 --target = i686-apple- darwin11 --with-gxx-include-dir =/usr/include/C++/4.2.1 थ्रेड मॉडल: पॉज़िक्स जीसीसी संस्करण 4.2.1 (ऐप्पल इंक के आधार पर 5658 का निर्माण) (एलएलवीएम 2336.11.00 का निर्माण)

कृपया मदद करें।

+0

'int main (int argc, char * argv [])' का उपयोग जब तर्कों का उपयोग नहीं किया जाता है तो हल्के ढंग से मूर्ख होता है; यह 'int मुख्य (शून्य)' या यहां तक ​​कि 'int मुख्य()' होना चाहिए। हालांकि, यह संभवतः एक और दिन के लिए बहस है। मुझे लगता है कि जीसीसी 5.x डिफ़ॉल्ट संकलन मोड के रूप में C11 ('-std = gnu11') का उपयोग करता है। 'clang' (' gcc' के रूप में masquerading) सी 99 का उपयोग करता है। सी 99 और सी 11 दोनों को सभी कार्यों की आवश्यकता होती है ('मुख्य() 'को छोड़कर) का उपयोग करने से पहले घोषित किया जाना चाहिए। –

उत्तर

40

आप stdio.h शामिल करने की ज़रूरत है, यानी

#include <stdio.h> 

शुरू में समारोह परिभाषा आयात करने के लिए।

+2

पाठ में भी 2 ज़ेड पॉइंट बताते हैं कि आप अपने शामिल कथन का उपयोग करके चेतावनी से छुटकारा पा सकते हैं। इसलिए मैं आपको सही उत्तर के साथ श्रेय दे रहा हूं। – grok12

3

यह "पुस्तक" का नाम बदलकर को बिना किसी गलत अर्थ के उदाहरणों का पालन करके सी से नफरत करना सीखें।

आधुनिक सी में सही कोड सादा और आसान

#include <stdio.h>  // include the correct header 

int main(void) {   // no need to repeat the argument mantra as they're not used 
    puts("Hello world."); 
}       // omit the return in main as it defaults to 0 anyway 

होगा मूल उदाहरण

int main(int argc, char *argv[]) { 
    puts("Hello world."); 
    return 0; 
} 

1989 में सादे बुरा हो गया होता है, में 1 999 (जो इस उत्तर के लेखन से 18 साल पहले है, और लगभग कई वर्ष "पुस्तक" लिखा गया था इससे पहले) सी मानक संशोधित किया गया था। सी 99 संशोधन में, implicit function declaration इस तरह के अवैध बना दिया गया था - और naturally it remains illegal in the current revision of the standard (C11)। इस प्रकार प्रासंगिक हैडर putsका उपयोग किए बिना #include ing, अर्थात prepending #include <stdio.h> (या int puts(const char*); साथ puts समारोह की घोषणा) एक बाधा त्रुटि है।

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

+0

क्या यह आधिकारिक मानक वेबसाइट/रिपोजिटरी चीज़ से लिंक है? – Ungeheuer

+0

@Ugegeheuer नहीं, दुर्भाग्य से [आधिकारिक मानक] (https://stackoverflow.com/questions/81656/where-do-i-find-the-current-c-or-c- मानक- दस्तावेज़) पैसे खर्च करते हैं। यह सी 11 फ़ाइनल * ड्राफ्ट * का एचटीएमएल संस्करण है जो इसके कामकाजी नाम ** n1570 ** द्वारा जाना जाता है। –

+0

धन्यवाद आदमी। अन्तिम प्रश्न। क्या लिंक की गई वेबसाइट के पिछले मानकों हैं? मुझे वहां से नेविगेट करने का कोई तरीका नहीं दिख रहा है। – Ungeheuer

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