दोनों कार्यक्रम गलत हैं।
दायरे में प्रोटोटाइप के बिना, एक कंपाइलर मानता है कि एक समारोह int
देता है और पैरामीटर की एक निर्दिष्ट संख्या लेता है।
के लिए अपनी फ़ाइलें थोड़ा बदल डालते हैं: (चाहिए भी, अनुरूप मोड में विजुअल C++)
$ cat func.c
double f(int a) {
return 1.0;
}
$ cat main.c
#include <stdio.h>
int main(void) {
double d = f();
printf("%lf\n", d);
return 0;
}
जब मैं यह संकलन, जीसीसी मुझे चेतावनी देते हैं। लेकिन चलो चेतावनी को अनदेखा करते हैं।
$ gcc -std=c99 -pedantic -W -Wall func.c main.c -o test
func.c:1: warning: unused parameter 'a'
main.c: In function 'main':
main.c:4: warning: implicit declaration of function 'f'
$ ./test
0.000000
यह 1 प्रिंट नहीं था, लेकिन मुद्रित 0. इसका कारण यह है संकलक मान लिया है कि f()
एक int
लौट आए, और काम d = f();
कि "int
" एक double
में बदला। कंपाइलर ने अभी भी कोड संकलित किया क्योंकि यह नहीं बता सका कि f()
को परिभाषित नहीं किया गया था (स्पष्ट रूप से) घोषित किया गया था। लेकिन उपर्युक्त प्रोग्राम को संकलित करना मानक द्वारा आवश्यक नहीं है, इसलिए संकलक इसे अस्वीकार कर सकता था (उदाहरण के लिए gcc -Werror
के साथ प्रयास करें!)
अगर हम एक फ़ाइल में सब कुछ है:
$ cat func.c >>main.c
$ gcc -std=c99 -pedantic -W -Wall func.c main.c -o test
main.c:4: warning: implicit declaration of function 'f'
main.c: At top level:
main.c:9: error: conflicting types for 'f'
main.c:4: error: previous implicit declaration of 'f' was here
main.c:9: warning: unused parameter 'a'
अब संकलक संघर्ष देखता है, और आपको एक त्रुटि संदेश देता है। लेकिन, उपरोक्त कार्यक्रम को अस्वीकार करने के लिए एक कंपाइलर की आवश्यकता नहीं है, यह हो सकता है या नहीं।
सबसे compilers पहला कार्यक्रम को अस्वीकार नहीं करता है, तो आप एक और अनुवाद इकाई या नहीं में समारोह f()
की सही परिभाषा है, क्योंकि वे नहीं जानते है। उन्होंने दूसरे कार्यक्रम को अस्वीकार कर दिया क्योंकि वे जानते हैं जो आप नहीं करते हैं।
स्रोत
2010-02-18 09:04:20
जैसा कि मैं समझता हूं: पहले मामले में लिंकर फ़ंक्शन को कॉल की परिभाषा के साथ बाध्य करने के लिए ज़िम्मेदार है; दूसरे मामले में संकलक फ़ंक्शन को कॉल की परिभाषा के साथ बाध्य करने के लिए ज़िम्मेदार है। क्या मैं सही हूँ? –