Meldung “Warnung: implizite Funktionsdeklaration”

Lesezeit: 4 Minuten

Benutzeravatar von Angus
Angus

Mein Compiler (GCC) gibt mir die Warnung:

Warnung: implizite Deklaration der Funktion

Warum kommt es?

  • Ein “Warum gibt es keine Fehlerversion”: stackoverflow.com/questions/434763/…

    – Ciro Santilli OurBigBook.com

    13. Mai 2015 um 7:27 Uhr


  • Dies kann auch passieren, wenn Sie vergessen, eine Header-Datei einzufügen. Wenn Sie beispielsweise versuchen, strlen() ohne string.h zu verwenden, erhalten Sie diesen Fehler

    – kurdtseite

    11. September 2016 um 8:21 Uhr

Benutzeravatar von cnicutar
Cnicutar

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

Zum Beispiel:

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 wie folgt vor main deklarieren, entweder direkt oder in einem Header:

int fun(int x, char *p);

  • Als Ergänzung, wenn Sie den Prototypen gegeben haben, überprüfen Sie, 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

    9. Dezember 2011 um 3:53 Uhr

  • Ich kann den Code nicht ausführen, nachdem ich diese Warnung erhalten habe. Es verhält sich also wie ein Fehler.

    – Miene

    21. Januar 2014 um 13:36 Uhr

  • @Flimm, C99 und C89/C90 hat dafür unterschiedliche Einstellungen

    – Wie Chen

    15. Januar 2015 um 6:06 Uhr


  • @Flimm stackoverflow.com/questions/434763/…

    – Ciro Santilli OurBigBook.com

    13. Mai 2015 um 7:29 Uhr

  • @ZachSaw Zu Recht. Sonst hättest du dich nicht dreimal wiederholt.

    – Nima Mussawi

    8. Dezember 2019 um 20:02 Uhr

Benutzeravatar von Faizal Pribadi
Faisal Pribadi

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
}

Wenn Sie Ihre #includes in main.c ausführen, platzieren Sie den #include-Verweis auf die Datei, die die referenzierte Funktion am Anfang der Include-Liste enthält. 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 wird nicht den Fehler “implizite Deklaration der Funktion” erzeugen, aber unten wird-

#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, es hat für mich getan.

Sie müssen die gewünschte Funktion vor Ihrer deklarieren hauptsächlich Funktion:

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

int main(void) {

   yourfunc();
 }

Wenn du die bekommst error: implicit declaration of function es sollte auch die störende Funktion auflisten. Dieser Fehler tritt häufig aufgrund einer vergessenen oder fehlenden Header-Datei auf, sodass Sie am Shell-Prompt etwas eingeben können man 2 functionname und schau dir die an SYNOPSIS Abschnitt oben, da dieser Abschnitt alle Header-Dateien auflistet, die eingeschlossen werden müssen. Oder Versuche http://linux.die.net/man/ Dies sind die Online-Manpages, die mit Hyperlinks versehen und einfach zu durchsuchen sind. Funktionen werden oft in den Header-Dateien definiert, das Einschließen aller erforderlichen Header-Dateien ist oft die Antwort. Wie Cnicutar sagte,

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

Wenn Sie die richtigen Header definiert haben und eine non GlibC Bibliothek (z Muss C) gcc wird auch werfen error: implicit declaration of function wenn GNU-Erweiterungen wie z malloc_trim angetroffen werden.

Die Lösung ist Wickeln Sie die Erweiterung und den Header ein:

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

Benutzeravatar von Peter Mortensen
Peter Mortensen

Vergessen Sie nicht, wenn Funktionen in Ihrer Funktion aufgerufen werden, müssen deren Prototypen im Code über Ihrer Funktion stehen. Andernfalls findet der Compiler sie möglicherweise nicht, bevor er versucht, Ihre Funktion zu kompilieren. Dadurch wird der betreffende Fehler generiert.

  • Fügt dies etwas hinzu, das nicht bereits von den anderen Antworten bereitgestellt wird?

    – Adrian Maulwurf

    15. Dezember 2020 um 13:33 Uhr

1433710cookie-checkMeldung “Warnung: implizite Funktionsdeklaration”

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy