C – Funktion hat interne Verknüpfung, ist aber nicht definiert

Lesezeit: 2 Minuten

Benutzeravatar von th3g3ntl3man
th3g3ntl3man

Ich habe diese Ordnerstruktur:

Struktur

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

ich die lagrange.h Datei habe ich diese:

#ifndef LAGRANGE_H

static void stampa(int i);

#endif /* LAGRANGE_H */

und in der lagrange.c Datei habe ich diese:

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#include <stdio.h>

void stampa(int i){
    printf("%d", i);
}

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

Benutzeravatar von Laurent H
Laurent H.

Erklärung des Fehlers:

Der Kompilierungsfehler tritt auf, weil:

  1. Sie haben eine Funktion mit deklariert static Schlüsselwort (also mit interner Verlinkung) drin lagrange.h
  2. 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

1437520cookie-checkC – Funktion hat interne Verknüpfung, ist aber nicht definiert

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

Privacy policy