Warnung: implizite Funktionsdeklaration


200

Mein Compiler (GCC) warnt mich:

Warnung: implizite Funktionsdeklaration

Bitte helfen Sie mir zu verstehen, warum es kommt.



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

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


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
}

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.


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.


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

1

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

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

int main(void) {

   yourfunc();
 }

0

Ich denke, die Frage ist nicht zu 100% beantwortet. Ich habe nach einem Problem mit dem fehlenden typeof () gesucht, bei dem es sich um eine Direktive zur Kompilierungszeit handelt.

Folgende Links beleuchten die Situation:

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

ab Zwang versuchen, __typeof__()stattdessen zu verwenden . Auch gcc ... -Dtypeof=__typeof__ ...kann helfen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.