C – Funktion hat interne Verknüpfung, ist aber nicht definiert
Lesezeit: 2 Minuten
th3g3ntl3man
Ich habe diese Ordnerstruktur:
Ich habe eine einfache Funktion geschrieben, um die Ordnerstruktur zu testen, um zu sehen, ob alle Header-Dateien vorhanden sind, aber wenn ich mit dem make-Befehl kompiliere, erhalte ich diesen Fehler:
Warnung: Die Funktion ‘stampa’ hat eine interne Verknüpfung, ist aber nicht definiert
am Ende Int main.c Ich rufe einfach die Funktion auf stampa ihnen eine Nummer zu übergeben.
Beiseite: Sie haben vergessen zu setzen #define LAGRANGE_H in lagrange.h
– Wetterfahne
27. Juni 2018 um 20:35 Uhr
Entferne das static Stichwort aus lagrange.h
– Benutzer3386109
27. Juni 2018 um 20:40 Uhr
Und es hat sich bewährt, die Header-Datei in die entsprechende .c-Datei aufzunehmen. Es sollte also eine geben #include "lagrange.h" in lagrange.c.
– Benutzer3386109
27. Juni 2018 um 20:43 Uhr
static beim Definieren einer Funktion bedeutet “nur in dieser Quelldatei”. Wenn Sie es in einen Header einfügen, ist es entweder bedeutungslos oder es erstellt eine neue Kopie der Funktion in jeder Datei, die es enthält. Nicht etwas, das Sie wollen.
– Zan Luchs
27. Juni 2018 um 20:51 Uhr
Laurent H.
Erklärung des Fehlers:
Der Kompilierungsfehler tritt auf, weil:
Sie haben eine Funktion mit deklariert static Schlüsselwort (also mit interner Verlinkung) drin lagrange.h
Und Sie haben diese Datei eingebunden lagrange.h in main.c Datei anders als lagrange.cwobei die Funktion nicht definiert ist.
Also, wenn der Compiler kompiliert main.c Datei, trifft es auf die static Deklaration ohne zugehörige Definition und löst logischerweise den Fehler aus. Die Fehlermeldung ist eindeutig.
Lösung:
In Ihrem Fall besteht die Lösung darin, die zu entfernen static Stichwort, weil static bedeutet, dass die Funktion nur in der .c-Datei aufgerufen werden kann, in der sie definiert ist, was bei Ihnen nicht der Fall ist.
Darüber hinaus kann es eine gute Praxis sein, alle zu deklarieren static Funktion in der gleichen .c-Datei, in der sie definiert ist, und nicht in der .h-Datei.
Vergessen Sie nicht, dass das Einfügen von Dingen in den anonymen Namensraum auch zu einer statischen Datei führt. z.B, namespace { ... } ist nur für diese Codeübersetzungseinheit sichtbar.
– Jesse Chisholm
22. Juli 2019 um 23:40 Uhr
@JesseChisholm, das ist nur für C ++ relevant, aber das OP spricht von C
– Nimrod Dayan
24. November 2021 um 21:45 Uhr
14375200cookie-checkC – Funktion hat interne Verknüpfung, ist aber nicht definiertyes
Beiseite: Sie haben vergessen zu setzen
#define LAGRANGE_H
inlagrange.h
– Wetterfahne
27. Juni 2018 um 20:35 Uhr
Entferne das
static
Stichwort auslagrange.h
– Benutzer3386109
27. Juni 2018 um 20:40 Uhr
Und es hat sich bewährt, die Header-Datei in die entsprechende .c-Datei aufzunehmen. Es sollte also eine geben
#include "lagrange.h"
in lagrange.c.– Benutzer3386109
27. Juni 2018 um 20:43 Uhr
static
beim Definieren einer Funktion bedeutet “nur in dieser Quelldatei”. Wenn Sie es in einen Header einfügen, ist es entweder bedeutungslos oder es erstellt eine neue Kopie der Funktion in jeder Datei, die es enthält. Nicht etwas, das Sie wollen.– Zan Luchs
27. Juni 2018 um 20:51 Uhr