2012-09-02 13 views
9

मेरे संकलक संकलक की व्याख्या नहीं कर सकता (जीसीसी) लाइन, जिसमें यह घोषणा पर फेंकता चेतावनी (नहीं त्रुटियों!) fp:चेतावनी

main.c: In function ‘main’: 
main.c:606: warning: implicit declaration of function ‘fdopen’ 
main.c:606: warning: initialization makes pointer from integer without a cast 

मैं इन समझ में नहीं आता:

int fd = open("filename.dat", O_RDONLY); 
FILE* fp = fdopen(fd, "r"); // get a file pointer fp from the file descriptor fd 

ये चेतावनी है fopen के वापसी मूल्य के बाद से चेतावनियां FILE* है। मैं यहां क्या गलती कर रहा हूं?

EDIT: मैं stdio.h (और मैं भी लिनक्स पर हूं) समेत हूं।

+3

क्या आप '# include'-इंग कर रहे हैं? – robert

+0

@robert: stdio.h, stdlib.h, string.h, errno.h, unistd.h, sys/type.h, sys/stat.h, fcntl.h – pap42

+0

क्या 'मैन fdopen' किसी हेडर को सूचीबद्ध करता है नहीं है? – robert

उत्तर

11

लघु जवाब: -std=gnu99 का उपयोग जब संकलन, हमेशा की तरह मानक गैर POSIX है और fdopen जरूरत नहीं है।


warning: implicit declaration of function ‘fdopen’ 

मतलब आप हेडर फाइल जो fdopen() की घोषणा में रहता शामिल करना भूल गए हैं तो फिर संकलक द्वारा एक अंतर्निहित घोषणा होता है -। और इसका मतलब है कि अज्ञात समारोह के रिटर्न मान पर मान लिया जाएगा int हो - इस प्रकार दूसरी चेतावनी। आप लिखने के लिए

#include <stdio.h> 

संपादित करें: अगर आप ठीक से stdio.h शामिल हैं, तो fdopen() प्रणाली लक्षित कर रहे हैं पर उपलब्ध नहीं हो सकता है। क्या आप विंडोज़ पर हैं? यह फ़ंक्शन केवल पॉज़िक्स है।

संपादित करें 2: क्षमा करें, मुझे वास्तव में यह समझना चाहिए था। सी 99 का अर्थ है एएनएसआई सी 99 मानक - और मानक सी गैर-पॉज़िक्स सिस्टम का समर्थन करने के लिए फ़ाइल डिस्क्रिप्टर की अवधारणा को मजबूर नहीं करता है, इसलिए यह केवल fopen() प्रदान करता है। fdopen() फ़ाइल डिस्क्रिप्टर से संबंधित है, इसलिए यह केवल POSIX है, इसलिए यह मानक C99 का हिस्सा नहीं है। यदि आप -std=gnu99 जीसीसी के लिए स्विच का उपयोग करते हैं, तो यह मानक के प्रतिबंध से छुटकारा पाता है और POSIX और GNU- केवल एक्सटेंशन में, आपकी समस्या को अनिवार्य रूप से ठीक करने देता है।

+1

क्षमा करें, मैं यह उल्लेख करना भूल गया कि मैं ** ** ** 'stdio.h' सहित (संपादित देखें)। – pap42

+1

@ pap42 आप विंडोज़ का उपयोग कर रहे हैं। यदि ऐसा है, तो मैं आपको रोकने और समाप्त करने का सुझाव देता हूं। –

+1

मैं वास्तव में लिनक्स पर हूं। – pap42

2

आप संकलक में #include <stdio.h> शामिल नहीं हैं इसलिए संकलक की घोषणा "अनुमान" है जिसे आप कॉल करने का प्रयास कर रहे हैं। (आपके द्वारा आधारित पैरामीटर लेना और वापसी मूल्य के रूप में int का उपयोग करना)। आम तौर पर आप ऐसे अनुमान नहीं चाहते हैं इसलिए संकलक आपको चेतावनी देता है।

समाधान: उचित #include एस जोड़ें।

+0

क्षमा करें, लेकिन यह उत्तर गलत है। मैं 'stdio.h' सहित हूं (संपादित देखें)। – pap42

+0

आप किस प्रणाली पर हैं? - POSIX का कहना है कि 'fdopen() '' stdio.h' (या stdio.h द्वारा शामिल शीर्षलेख में) होना चाहिए - http://pubs.opengroup.org/onlinepubs/007908775/xsh/fdopen.html – johannes

+0

I मैं लिनक्स पर हूं (और मैं इस चेतावनी से भी उतना ही परेशान हूं क्योंकि मैं 'stdio.h' समेत हूं)। – pap42

0

fdopen फ़ंक्शन सी मानक का हिस्सा नहीं है और यदि आप मानक सी मोड में संकलित करते हैं तो मानक हेडर के हिस्से के रूप में उपलब्ध नहीं है। इसलिए आपको अपने स्रोत को संकलित करने या स्वयं को कार्य घोषित करने के लिए -std=c99 के बजाय -std=gnu99 का उपयोग करने की आवश्यकता है।

0

वहाँ संकलक के @ H2CO3 के जवाब में नैदानिक ​​के लिए एक अच्छा विवरण है, तो चलो केवल पर देखने के लिए क्यों चीजों की: आप glibc उपयोग कर रहे हैं (और आप शायद कर रहे हैं), कुछ POSIX कार्यों विशिष्ट सुविधा की आवश्यकता हो सकती दिखाने के लिए मैक्रोज़ परीक्षण करें।

विशेष रूप से, आप निम्न पंक्ति डाल करने के लिए आवश्यकता हो सकती है: यह भी एक ही प्रभाव को कमांड लाइन विकल्प हैं

#define _POSIX_SOURCE 
// or #define _XOPEN_SOURCE 

से पहले

(जैसे जीसीसी के रूप में)
#include <stdio.h> 

कुछ compilers (सभी जीसीसी में gnu* मानक विकल्प)।

+1

यह सिद्धांत में सही है, लेकिन '_POSIX_SOURCE' पॉज़िक्स मानक के पुराने 90 के दशक के संस्करण से है। आधुनिक नाम '_POSIX_C_SOURCE' है और इसे केवल रिक्त परिभाषा में परिभाषित नहीं किया जा सकता है; इसे आपके इच्छित संस्करण में परिभाषित किया जाना है। '20080 9 एल' वर्तमान मानक के लिए सही मूल्य है। –

1
#define _XOPEN_SOURCE 600 
#include <stdio.h> 

यह सख्त c99 के साथ पूरी तरह अनुरूप है

gcc -std=c99 -pedantic -Wall -Wextra -Werror 
संबंधित मुद्दे