2011-12-09 15 views
140

मेरे संकलक (जीसीसी) मेरे चेतावनी दे रहा है:चेतावनी: समारोह के निहित घोषणा

चेतावनी: समारोह के निहित घोषणा

कृपया मेरी मदद क्यों यह आ रहा है।

+1

ए "यह एक त्रुटि संस्करण क्यों नहीं देता है": http://stackoverflow.com/questions/434763/are-prototypes-required-for-all-functions-in-c89-c90-or-c99 –

उत्तर

163

आप एक फ़ंक्शन का उपयोग कर रहे हैं जिसके लिए कंपाइलर ने घोषणा नहीं देखी है ("प्रोटोटाइप") अभी तक।

उदाहरण के लिए:

int main() 
{ 
    fun(2, "21"); /* The compiler has not seen the declaration. */  
    return 0; 
} 

int fun(int x, char *p) 
{ 
    /* ... */ 
} 

आप, मुख्य समारोह से पहले अपने घोषणा करने के लिए इस तरह, या तो सीधे या एक शीर्ष लेख में की जरूरत है:

int fun(int x, char *p); 
+7

जैसा एक अतिरिक्त अगर आपने प्रोटोटाइप दिया है तो यह जांच करें कि यह सिर्फ एक टाइपो नहीं है। अगर बाहरी पुस्तकालय से यह भी जांच लें कि आपने इसे शामिल किया है। – smitec

+40

यह चेतावनी क्यों है और कोई त्रुटि नहीं है? – Flimm

+1

मुझे यह चेतावनी मिलने के बाद कोड नहीं चलाया जा सकता है। तो यह एक त्रुटि की तरह व्यवहार करता है। – Mien

13

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

उदाहरण

main.h

#ifndef MAIN_H 
#define MAIN_H 

int some_main(const char *name); 

#endif 

main.c

#include "main.h" 

int main() 
{ 
    some_main("Hello, World\n"); 
} 

int some_main(const char *name) 
{ 
    printf("%s", name); 
} 

एक फ़ाइल (main.c)

साथ वैकल्पिक
static int some_main(const char *name); 

int some_main(const char *name) 
{ 
    // do something 
} 
2

आप सही हेडर & परिभाषित (जैसे Musl C के रूप में) gcc एक गैर GlibC पुस्तकालय का उपयोग कर रहे भी error: implicit declaration of function फेंक होगा जब इस तरह के malloc_trim के रूप में जीएनयू एक्सटेंशन का सामना करना पड़ा रहे है।

समाधान wrap the extension & the header के लिए है:

#if defined (__GLIBC__) 
    malloc_trim(0); 
#endif 
2

यह भी अपमानजनक समारोह में सूचीबद्ध करना चाहिए जब आप error: implicit declaration of function मिलता है। प्रायः यह त्रुटि भूल गई या अनुपलब्ध शीर्षलेख फ़ाइल के कारण होती है, इसलिए शेल प्रॉम्प्ट पर आप man 2 functionname टाइप कर सकते हैं और शीर्ष पर SYNOPSIS अनुभाग देख सकते हैं, क्योंकि यह अनुभाग किसी भी शीर्षलेख फ़ाइलों को सूचीबद्ध करने की आवश्यकता है। या http://linux.die.net/man/ आज़माएं यह ऑनलाइन मैन पेज है जो वे हाइपरलिंक्ड हैं और खोजना आसान है। फ़ंक्शंस को हेडर फ़ाइलों में अक्सर परिभाषित किया जाता है, जिसमें किसी भी आवश्यक शीर्षलेख फ़ाइलों को अक्सर उत्तर दिया जाता है। cnicutar की तरह कहा,

आप एक समारोह जिसके लिए संकलक एक घोषणा ("प्रोटोटाइप") अभी तक नहीं देखा गया है का उपयोग कर रहे हैं।

0

मुझे लगता है कि प्रश्न 100% उत्तर नहीं दिया गया है। मैं लापता टाइपऑफ() के साथ समस्या की तलाश कर रहा था, जो संकलन समय निर्देश है।

निम्न लिंक की स्थिति पर प्रकाश डालने देगा:

https://gcc.gnu.org/onlinedocs/gcc-5.3.0/gcc/Typeof.html

https://gcc.gnu.org/onlinedocs/gcc-5.3.0/gcc/Alternate-Keywords.html#Alternate-Keywords

conculsion के रूप में के बजाय __typeof__() उपयोग करने के लिए प्रयास करें। gcc ... -Dtypeof=__typeof__ ... भी मदद कर सकता है।

0

यह भी हो सकता है यदि आप एक हेडर फ़ाइल शामिल करना भूल जाते हैं। उदाहरण के लिए यदि आप string.h सहित बिना strlen() का उपयोग करने का प्रयास कर रहे हैं, तो आपको यह त्रुटि मिल जाएगी

5

जब आप मुख्य.c में अपना # शामिल करते हैं, तो उस संदर्भ में # अंतर्निहित संदर्भ डालें जिसमें संदर्भित फ़ंक्शन है सूची शामिल करने के शीर्ष। उदा। कहते हैं कि यह main.c है और अपने संदर्भित समारोह "SSD1306_LCD.h" में है

#include "SSD1306_LCD.h"  
#include "system.h"  #include <stdio.h> 
#include <stdlib.h> 
#include <xc.h> 
#include <string.h> 
#include <math.h> 
#include <libpic30.h>  // http://microchip.wikidot.com/faq:74 
#include <stdint.h> 
#include <stdbool.h> 
#include "GenericTypeDefs.h" // This has the 'BYTE' type definition 

उपरोक्त त्रुटि "समारोह का अंतर्निहित घोषणा" उत्पन्न नहीं होगा, लेकिन will-

#include "system.h"   
#include <stdio.h> 
#include <stdlib.h> 
#include <xc.h> 
#include <string.h> 
#include <math.h> 
#include <libpic30.h>  // http://microchip.wikidot.com/faq:74 
#include <stdint.h> 
#include <stdbool.h> 
#include "GenericTypeDefs.h"  // This has the 'BYTE' type definition 
#include "SSD1306_LCD.h"  

बिल्कुल नीचे वही # शामिल सूची, बस अलग आदेश।

अच्छा, यह मेरे लिए किया गया।

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