Warnung: implizite Funktionsdeklaration

200

Mein Compiler (GCC) warnt mich:

Warnung: implizite Funktionsdeklaration

Bitte helfen Sie mir zu verstehen, warum es kommt.

Angus
quelle
1
Ein "Warum gibt es keine Fehlerversion": stackoverflow.com/questions/434763/…
Ciro Santilli 13 冠状 病 六四 六四 13
Dies kann auch passieren, wenn Sie vergessen, eine Header-Datei einzuschließen. Wenn Sie beispielsweise versuchen, strlen () ohne string.h zu verwenden, wird dieser Fehler
angezeigt

Antworten:

229

Sie verwenden eine Funktion, für die der Compiler noch keine Deklaration (" Prototyp ") gesehen hat.

Beispielsweise:

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

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

Sie müssen Ihre Funktion vor main deklarieren, entweder direkt oder in einer Kopfzeile:

int fun(int x, char *p);
cnicutar
quelle
9
Wenn Sie den Prototyp überprüft haben, überprüfen Sie zusätzlich, ob es sich nicht nur um einen Tippfehler handelt. Auch wenn es aus einer externen Bibliothek stammt, überprüfen Sie, ob Sie es aufgenommen haben.
Smitec
1
Ich kann den Code nicht ausführen, nachdem ich diese Warnung erhalten habe. Es verhält sich also wie ein Fehler.
Mien
@ Flimm, C99 und C89 / C90 hat unterschiedliche Einstellungen dafür
Wie Chen
3
@ Flimm stackoverflow.com/questions/434763/…
Ciro Santilli 郝海东 冠状 病 六四 事件 13
1
@ ZachSaw Zu Recht. Sonst hättest du dich nicht dreimal wiederholt.
Nima Mousavi
19

Der richtige Weg ist, den Funktionsprototyp im Header zu deklarieren.

Beispiel

main.h

#ifndef MAIN_H
#define MAIN_H

int some_main(const char *name);

#endif

Haupt c

#include "main.h"

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

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

Alternative mit einer Datei (main.c)

static int some_main(const char *name);

int some_main(const char *name)
{
    // do something
}
Faizal Pribadi
quelle
7

Wenn Sie Ihre #includes in main.c ausführen, setzen Sie den # include-Verweis auf die Datei, die die referenzierte Funktion enthält, oben in die Include-Liste. Angenommen, dies ist main.c und Ihre referenzierte Funktion befindet sich in "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

Das Obige erzeugt nicht den Fehler "implizite Funktionsdeklaration", sondern das Folgende:

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

Genau die gleiche # include-Liste, nur andere Reihenfolge.

Nun, das hat es für mich getan.

Tomc
quelle
3

Wenn Sie das bekommen error: implicit declaration of function, sollte es auch die störende Funktion auflisten. Dieser Fehler tritt häufig aufgrund einer vergessenen oder fehlenden Header-Datei auf. Sie können also an der Shell-Eingabeaufforderung man 2 functionnameden SYNOPSISAbschnitt oben eingeben und anzeigen , da in diesem Abschnitt alle Header-Dateien aufgelistet werden, die eingeschlossen werden müssen. Oder versuchen Sie es mit http://linux.die.net/man/. Dies sind die Online-Manpages, auf die sie verlinkt sind und die leicht zu durchsuchen sind. Funktionen werden häufig in den Header-Dateien definiert, einschließlich aller erforderlichen Header-Dateien ist häufig die Antwort. Wie cnicutar sagte,

Sie verwenden eine Funktion, für die der Compiler noch keine Deklaration ("Prototyp") gesehen hat.

Dwayne
quelle
2

Wenn Sie die richtigen Header definiert haben und eine Nicht- GlibCBibliothek (wie Musl C ) verwenden, gccwird auch ausgelöst, error: implicit declaration of functionwenn GNU-Erweiterungen wie z malloc_trim.

Die Lösung besteht darin, die Erweiterung und den Header zu verpacken :

#if defined (__GLIBC__)
  malloc_trim(0);
#endif
Stuart Cardall
quelle
1

Sie müssen die gewünschte Funktion vor Ihrer Hauptfunktion deklarieren :

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

int main(void) {

   yourfunc();
 }
Poussy
quelle