GCC-Fehler: implicit declaration of function ... beheben
Problem:
Beim Versuch, das C/C++-Programm zu kompilieren, erscheint eine Fehlermeldung wie
../src/main.c:48:9: error: implicit declaration of function 'StartBenchmark' [-Werror=implicit-function-declaration]
StartBenchmark();Lösung
implicit declaration of function bedeutet, dass eine Funktion verwendet wird, die nicht deklariert wurde. Im obigen Beispiel ist StartBenchmark die Funktion, die implizit deklariert wurde.
So wird eine Funktion aufgerufen:
StartBenchmark();So wird eine Funktion deklariert:
void StartBenchmark();Die folgenden Aufzählungspunkte listen die häufigsten Ursachen und deren Behebung:
- Fehlendes
#include: Prüfen, ob die Header-Datei, die die Deklaration der Funktion enthält, in jeder Datei, in der die Funktion aufgerufen wird, per#includeeingebunden ist (insbesondere in der Datei, die in der Fehlermeldung genannt wird), vor dem ersten Aufruf der Funktion (typischerweise am Anfang der Datei). Header-Dateien können über andere Header eingebunden werden. - Tippfehler im Funktionsnamen: Oft stimmt der Funktionsname der Deklaration nicht exakt mit dem Funktionsnamen überein, der aufgerufen wird. Beispielsweise wird
startBenchmark()deklariert, währendStartBenchmark()aufgerufen wird. Empfohlen wird, dies durch Kopieren & Einfügen des Funktionsnamens aus der Deklaration an alle Stellen zu beheben, an denen er aufgerufen wird. - Fehlerhafter Include-Guard: Der von IDEs automatisch generierte Include-Guard sieht oft so aus:
#ifndef _EXAMPLE_FILE_NAME_H
#define _EXAMPLE_FILE_NAME_H
// ...
#endifBeachten, dass die Include-Guard-Definition _EXAMPLE_FILE_NAME_H nicht spezifisch für den verwendeten Header-Dateinamen (z.B. Benchmark.h) ist. Nur der erste aller Header-Dateinamen wird
4. Reihenfolge der #include-Anweisungen ändern: Dies mag wie ein schlechter Hack erscheinen, funktioniert aber oft einwandfrei. Einfach die #include-Anweisungen der Header-Datei mit der Deklaration nach oben verschieben. Beispielsweise vor dem Verschieben:
#include "Benchmark.h"
#include "other_header.h"nach dem Verschieben:
#include "Benchmark.h"
#include "other_header.h"