Ich habe eine Header-Datei (declaration.h) wie oben definiert und folgendes ist ein c-Programm (stack.c) Ich mache, was in der Bibliothek, die ich entwickle, verwendet würde %Vor%
Beide Dateien befinden sich im selben Verzeichnis.
Ich habe die obige Datei stack.c kompiliert
cc -I ./ stack.c
I folgende Warnungen
Ich möchte wissen, wann ich eine Variable als extern deklariert habe, die ich fett markiert habe, warum bekomme ich das als Warnung irgendwelche Gedanken dazu und wenn jemand etwas anderes über verbleibende Fehler teilen möchte, dann lass es mich wissen.
Während Ihr Code eine Reihe ziemlich ernster und offensichtlicher Fehler enthält (bereits in anderen Antworten behandelt), ist die Warnung, die Sie in den Titel Ihrer Frage eingeben, eine völlig überflüssige, bedeutungslose Warnung. Der GCC-Compiler ist dafür bekannt, nutzlose Warnungen ausgegeben zu haben. Viele dieser Warnungen scheinen sich aus dem inkompetenten und völlig unbegründeten Glauben zu ergeben, dass etwas zu tun irgendwie "falsch" ist, während in Wirklichkeit nichts daran falsch ist.
In Ihrem Fall wird die Warnung durch
ausgelöst %Vor% Erklärung. Offenbar glaubte der "Autor" der Warnung, dass extern
specifier für nicht-definierende Deklarationen reserviert sein sollte. In diesem Fall verwandelt das Vorhandensein des Initialisierers = 0
die Deklaration in eine Definition (und macht damit formal extern
optional). Nichtsdestotrotz gibt es keinen Fehler darin, und tatsächlich könnte extern
hier durchaus willkommen sein, um die Tatsache hervorzuheben, dass stack_counter
eine globale Variable sein soll.
Auch hier ist es eine andere Frage, ob Sie eine globale Variable benötigen oder nicht. Auch hier enthält Ihr Code eine große Anzahl anderer Fehler. Aber die Warnung, auf die Sie Ihre Aufmerksamkeit zu richten scheinen, ist es nicht wirklich wert. Deaktivieren Sie diese Warnung in den Compiler-Einstellungen (und schreiben Sie dem GCC-Team bitte einen groben Brief).
Die externe Deklaration in Ihrer Header-Datei lässt andere Module als die, in denen die Variable definiert ist, verwenden. Wenn es als int stack_counter = 0
definiert werden soll und in stack.c leben soll, definiere es so und setze ein extern stack_counter
in die Kopfzeile.
In Zeile 6 von stack.c haben Sie keine Speicherklasse für sroot definiert. Da es in der Kopfzeile angezeigt wird, nehme ich an, dass Sie snode sroot=NULL
eingeben möchten.
Fix diese, dann implementieren Sie stackpush (stellen Sie sicher, dass es nicht void zurückkehrt) und kümmern sich um den Rest Ihrer Warnungen in Reihenfolge. Beachten Sie, dass Sie in C entweder Vorwärtsdeklarationen von Funktionen (mit Prototypen) verwenden oder Ihre Funktionen definieren müssen, bevor sie verwendet werden. Die Funktion cstack
sollte wahrscheinlich die letzte Funktion in der Datei sein.
Tags und Links c