चेतावनी: फ़ंक्शन की अंतर्निहित घोषणा


201

मेरा संकलक (GCC) मुझे चेतावनी दे रहा है:

चेतावनी: फ़ंक्शन की अंतर्निहित घोषणा

कृपया मुझे यह समझने में मदद करें कि यह क्यों आ रहा है।


1
"यह एक त्रुटि संस्करण क्यों नहीं देता है": stackoverflow.com/questions/434763/…
Ciro Santilli Sant not not not ''

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

जवाबों:


230

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

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

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);

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

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

@ फ्लीम, C99 और C89 / C90 में इसके लिए अलग-अलग सेटिंग हैं
How Chen


1
@ZachSaw ठीक है। वरना आपने खुद को तीन बार नहीं दोहराया होता।
नीमा मौसवी

19

सही तरीका है हेडर में फ़ंक्शन प्रोटोटाइप की घोषणा करना।

उदाहरण

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
}

7

जब आप अपने #includes को main.c में करते हैं, तो #include संदर्भ को उस फ़ाइल में डालें जिसमें शामिल सूची के शीर्ष पर संदर्भित फ़ंक्शन है। उदा। यह कहो कि यह मुख्य है और आपका संदर्भित कार्य "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

उपरोक्त "फ़ंक्शन के निहित घोषणा" त्रुटि उत्पन्न नहीं करेगा, लेकिन नीचे होगा-

#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"    

बिल्कुल वही #include सूची, बस अलग क्रम।

खैर, यह मेरे लिए किया था।


3

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

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


2

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

समाधान एक्सटेंशन और हेडर को लपेटने के लिए है :

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

1

आपको अपने मुख्य कार्य से पहले वांछित फ़ंक्शन की घोषणा करने की आवश्यकता है :

#include <stdio.h>
int yourfunc(void);

int main(void) {

   yourfunc();
 }

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.