2009-11-23 11 views
8

मैं है निम्नलिखित सी कोड:जीसीसी रिपोर्ट "समारोह की पूर्ण घोषणा" दौर क्यों करती है?

#include <math.h> 

int main(int argc, char ** argv) 
{ 
    double mydouble = 100.0; 
    double whatever = round(mydouble); 

    return (int) whatever; 
} 

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

round_test.c: In function ‘main’: 
round_test.c:6: warning: implicit declaration of function ‘round’ 
round_test.c:6: warning: incompatible implicit declaration of built-in function ‘round’ 

मैं सी के साथ जंग लगी हूँ, लेकिन मैंने सोचा कि # शामिल एक घोषणा लाया गोल() के लिए दायरे में। मैंने अपने एएनएसआई मानक की जांच की है (सी 99 मेरी एकमात्र प्रति है) जो पुष्टि करता है कि राउंड() फ़ंक्शन math.h शीर्षलेख में मौजूद है। मुझे यहां क्या समझ नहीं आ रहा है?

संपादित करें: कंपाइलर उबंटू (निडर, आईआईआरसी) पर जीसीसी 4.3.2 है। जीसीसी-ई चल रहा है:

$ gcc -E round_test.c | grep round 
# 1 "round_test.c" 
# 1 "round_test.c" 
# 2 "round_test.c" 2 
    double whatever = round(mydouble); 

इसलिए परिभाषा स्पष्ट रूप से शीर्षकों में नहीं मिल रही है।

उत्तर

17

मुझे लगता है कि आप जीसीसी का उपयोग कर रहे हैं।

डिफ़ॉल्ट रूप से, जीसीसी सी 8 9 के समान मानक का उपयोग करता है। आप इसे C99 मानक (भागों यह के अनुरूप है)

gcc -std=c99 -pedantic ... 

GCC Manual

डिफ़ॉल्ट रूप से से उद्धरण का उपयोग करने के लिए "मजबूर" करना चाहते हैं, जीसीसी उस पर सी भाषा के लिए कुछ एक्सटेंशन प्रदान करता है दुर्लभ अवसर सी मानक के साथ संघर्ष करते हैं। सी भाषा परिवार में एक्सटेंशन देखें। उपरोक्त सूचीबद्ध -स्ट विकल्पों का उपयोग इन एक्सटेंशन को अक्षम कर देगा जहां वे चयनित मानक संस्करण के साथ पर संघर्ष करते हैं। (जीएनयू एक्सटेंशन के साथ C99 के लिए) तुम भी या -std = gnu99 (जीएनयू एक्सटेंशन के साथ C89 के लिए) सी भाषा स्पष्ट रूप से की एक विस्तारित संस्करण के साथ -std = gnu89 चुन सकते हैं। डिफ़ॉल्ट, यदि कोई सी भाषा बोली विकल्प दिया गया है, is -std = gnu89; C99 समर्थन पूरा होने पर यह से -std = gnu99 को कुछ भविष्य में रिलीज में बदल देगा। कुछ विशेषताएं जो C99 मानक का हिस्सा हैं C89 मोड में एक्सटेंशन के रूप में स्वीकार की जाती हैं।

+1

धन्यवाद, -std = c99 इसे हल करने लग रहा था। मुझे एहसास नहीं हुआ था() एक सी 99 जोड़ था (और निश्चित रूप से मेरे सभी संदर्भ सी 99 हैं और इसका उल्लेख करने के लिए उपेक्षा) –

+0

(आश्चर्यचकित देखो) क्या राउंड() वास्तव में एक सी 99 अतिरिक्त है? –

+0

दाएं, सी 8 9 ने 'राउंड()' फ़ंक्शन का वर्णन नहीं किया (निश्चित रूप से कंपाइलर इसे एक एक्सटेंशन के रूप में प्रदान कर सकते हैं)। – pmg

3

आपके जीसीसी स्थापना, सिस्टम हेडर, या संकलन विकल्पों के साथ कुछ गलत होना चाहिए।

-E के साथ संकलन करने का प्रयास करें। यह आपको दिखाएगा कि प्रीप्रोसेसर आउटपुट क्या है - जिसमें हेडर शामिल किए जा रहे हैं और उनमें क्या है।

extern double round (double __x) __attribute__ ((__nothrow__)) __attribute__ ((__const__)); 
+0

मैं उबंटू 9 .10 (कर्मिक) पर हूं। यहां # # शामिल करें 'लोड /usr/include/math.h जो /usr/include/bits/mathcalls.h लोड करता है जिसमें घोषणा शामिल है। –

0

कोड आप टाइप जीसीसी 4.0.1 के साथ MacOS एक्स 10.5.8 पर सफाई से संकलित: मेरे Ubuntu Linux सिस्टम पर यह उत्पादन का लगभग 1000 लाइनों, इस सहित है। यदि विकल्प '-Wall -Wextra' के साथ प्रक्षेपित किया गया है, तो यह अप्रयुक्त पैरामीटर argc और argv - सामग्री नहीं के बारे में शिकायत करता है।

क्या आपने अपनी मशीन पर <math.h> देखा है?

क्या आपने '-stc = c99' जैसे विकल्पों के साथ प्रयास किया है?

3

आप जीसीसी आप C99 चाहते हैं कि बताने के लिए की जरूरत है, और आप libm में लिंक करना चाहते हैं कि:

gcc -std=c99 -lm round_test.c 
-2

आप गणित पुस्तकालय के साथ लिंक करना होगा। तो जब आप संकलित करते हैं, तो -lm ध्वज जोड़ना सुनिश्चित करें।

+1

इनपुट के लिए धन्यवाद, लेकिन यह एक संकलन समस्या है, एक लिंक समस्या नहीं है। मुझे एहसास हुआ कि मैंने अपना कंपाइलर कमांड छोड़ दिया (मेरा बुरा), लेकिन मैं जीसीसी-सी के साथ संकलित था। –

0

सी 99 उत्तर था, लेकिन पूरी कहानी थोड़ा और जटिल है। जिस कारण से मैं खेल रहा था वह यह था कि मैं विंडोज के लिए लिखी गई लाइब्रेरी को संकलित करने की कोशिश कर रहा था, जिसकी गोल() की अपनी "अनुकूलित" परिभाषा थी। मुझे एक लिंकर त्रुटि मिली जो मुझे बता रही थी कि परिभाषा अंतर्निहित के साथ विवादित है, इसलिए मैंने परिभाषा (और घोषणा) को हटा दिया। एक बार ऐसा करने के बाद मैंने "निहित घोषणा त्रुटि" प्राप्त करना शुरू कर दिया।

ऐसा लगता है कि डिफ़ॉल्ट संकलन मोड (-std = c99 ध्वज के बिना) न तो C89 और C99 अनुरूप है: यदि यह C89 अनुरूप था, तो आप विरोधाभास के बिना दौर() की एक कस्टम परिभाषा प्रदान करने में सक्षम होना चाहिए, और अगर यह सी 99 अनुरूप था तो घोषणापत्र गणित में होना चाहिए।

+1

डिफ़ॉल्ट मोड '-std = gnu89' है :) – pmg

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