Hallo und willkommen zurück.
In diesem Vortrag möchte ich nur einige gängige Compiler und Warnungen durchgehen.
Wir haben über einige der häufigsten Probleme gesprochen.
Aber manchmal wissen Sie nicht einmal, dass Sie diese Fehler in Ihrem Programm haben, wenn
der Compiler versucht, Ihnen das mitzuteilen.
Compilerfehler und Warnungen sind für neue Programmierer in der Regel sehr kryptisch.
Sie sagen Ihnen vielleicht, dass Ihnen ein Semikolon fehlt, aber es steht für ein nicht erreichbares Ende der Anweisung.
Und für jemanden, der neu ist, wissen sie vielleicht nicht einmal, was das bedeutet.
Es erfordert also viel Übung, viel Code zu schreiben
und einige dieser Compiler-Warnungen im Laufe der Zeit zu entschlüsseln.
Aber ich möchte Ihnen vorher einen Hinweis geben.
Bei einigen der häufigsten Probleme, die Sie in der vorherigen Vorlesung
gesehen haben, werde ich einige der Compiler-Warnungen und -Fehler beschreiben und erläutern, was tatsächlich gesagt wird.
Es ist sehr, sehr wichtig, Ihnen zu sagen, dass Sie verstehen sollen, was der Compiler Ihnen sagt.
Wenn der Compiler Ihnen diese Fehler mitteilt, Sie diesen Fehler jedoch
nicht verstehen, dauert die Behebung dieses Codes viel länger.
Aber wenn Sie den Fehler sehen und genau wissen, was er sagt, können
Sie ihn in kürzester Zeit beheben.
Ich erinnere mich, ich war im Labor, als ich
anfing zu programmieren, und mir
fehlte ein Semikolon, was sehr häufig vorkommt. Und der Compiler würde mir sagen, dass mir ein Semikolon fehlt,
aber ich würde das nicht
wissen, es würde nur das unerreichbare Ende der Anweisung sagen, und ich würde sagen,
was bedeutet das, was ist eine Anweisung. Ich wäre sehr verwirrt.
Deshalb wollte ich Ihnen einige Tipps geben, was der Compiler Ihnen tatsächlich zu sagen versucht.
Es ist also sehr schwer zu verstehen, worüber sich der Compiler beschwert.
Das Entschlüsseln dieser Nachrichten ist
manchmal sehr verwirrend.
Sie müssen diese Compilerfehler also verstehen, um sie zu beheben, ziemlich einfach.
Und der Compiler erledigt die halbe Arbeit für Sie.
Es überprüft die Syntax und sagt Ihnen genau, was falsch ist.
Sie sollten dies also zu Ihrem Vorteil nutzen.
Aber manchmal ist es schwierig, genau zu verstehen, was es sagt, besonders wenn Sie
neu sind und einige der Begriffe nicht verstehen.
Der Compiler trifft Entscheidungen darüber, wie Ihr Code übersetzt werden soll, den
der Programmierer nicht in den Code geschrieben hat.
Dies ist praktisch für das Programm und den Compiler,
damit es prägnanter geschrieben werden kann.
Und nur erfahrene Programmierer nutzen diese Funktion.
Ich sage Ihnen also, wenn Sie kompilieren, sollten
Sie immer die Dash-Wall-Option verwenden.
Dies wird alles einschalten.
Manchmal ist eine erweiterte Funktion, dass Sie tatsächlich
einige Dinge herausnehmen
und die Übersetzung ein wenig effizienter gestalten.
Wenn Sie dies
hinzufügen, wird das Programm jedoch anders kompiliert.
Infolgedessen enthält Ihr Code möglicherweise Warnungen, von denen Sie nichts wissen.
Der Grund, warum ich Ihnen sage, ist, dass Sie immer mit einer bestimmten Option
kompilieren möchten, nämlich der Dash-Wall-Option.
Und Sie sind tatsächlich standardmäßig in Codeblöcken aktiviert.
Dadurch werden Sie über alle Fälle informiert, in denen der Compiler
Dinge ausführt, von denen Sie nichts wissen.
Es werden auch alle Warnungen aktiviert,
Sie erhalten viele Informationen, es ist eine sehr nützliche Compiler-Option.
Sobald Sie diese Option aktiviert haben, können
Sie versuchen, besser zu verstehen, was der Compiler Ihnen sagt.
Der Compiler zeigt Ihnen also zwei
Arten von Problemen. Eins ist ein Fehler.
Dies verhindert tatsächlich die Erstellung des Programms.
Sie haben einen Syntaxfehler und das Programm kann nicht kompiliert werden.
Keine ausführbare
Arbeit neu erstellt und. Wenn Sie Fehler vom Compiler sehen, möchten Sie sich
normalerweise immer auf diesen ersten Fehler konzentrieren.
Dies ist der zuverlässigste
Fehler, da einige der anderen Fehler möglicherweise auf diesen ersten Fehler zurückzuführen sind.
Konzentrieren Sie sich also immer auf diesen ersten Fehler. Beheben Sie die Fehler oben und kompilieren
Sie sie dann erneut, um festzustellen, ob die anderen Fehler behoben sind.
Warnungen. Warnungen sind Meldungen, die der
Compiler für bestimmte Situationen anzeigt und in denen eine Art von Anomalie festgestellt wurde.
Sie sind nicht schwerwiegende Fehler. So wird die ausführbare Datei erstellt.
Aber es ist immer noch etwas, das Sie beheben sollten.
Eine Warnung gibt es aus einem Grund. Sie machen entweder etwas falsch
oder es könnte in Zukunft ein Problem verursachen.
Sie möchten also immer alle Ihre Warnungen korrigieren.
Wenn Sie mit der Dash-Wall-Option kompilieren, wird
das Programm erst dann als korrekt angesehen, wenn alle Warnungen entfernt wurden.
Die Kompilierung wird also nicht fehlschlagen. Aus diesem Grund fordere ich
Sie auf, diese Option zu verwenden und alles zu sehen, was vom Compiler vor sich geht.
Einige der häufigsten Compiler-Meldungen, auf die Sie stoßen, stehen in
direktem Zusammenhang mit einigen der häufigsten C-Probleme, die wir
bereits erwähnt haben.
Wenn eine Variable nicht deklariert ist, wird diese Nachrichtenvariable mit dieser Funktion
zuerst nicht deklariert.
Dies ist eine der häufigsten und in der Regel leichter zu erkennenden.
Und dann wird auch das Symbol vor
dieser Nachricht angezeigt.
Grundsätzlich wird gesagt, dass Sie
versuchen, diese Variable zu verwenden, aber Sie haben sie nie deklariert.
Wir wissen, dass Sie beim Deklarieren einer Variablen den Datentyp angeben.
Sie können nicht einfach Daten für Variablen signieren, die nicht vorhanden sind.
Eine implizite Warnungsdeklaration der Funktion, die sich auf die Funktionsdeklarationen bezieht.
Dies ist der Fall, wenn Sie versuchen, eine Funktion
aufzurufen, der Funktion jedoch keine Implementierung zugeordnet ist. Sie haben den Header nicht eingefügt
oder nicht deklariert. Es weiß also nicht, wo es sich
befindet, und es weiß nicht, wie die Funktion deklariert ist, es kennt die Argumente nicht, es kennt den Rückgabewert nicht.
Hat keine Information über die Funktion selbst?
Um dies zu lösen, deklarieren Sie immer oben einen Funktionsprototyp.
Eine weitere Warnung besagt, dass die Warnsteuerung das Ende der nicht ungültigen Funktion erreicht.
Dies geschieht, wenn eine Funktion so definiert wurde, dass sie ein Ergebnis zurückgibt, das
nicht ungültig ist, die Funktion jedoch keine return-Anweisung enthält.
Sie haben also vergessen, die Daten zurückzugeben.
Entweder ist die Funktion falsch definiert, wenn Sie den Datentyp vor
der Funktionsdeklaration entfernen müssen, oder Sie haben
vergessen, diese return-Anweisung hinzuzufügen. Eine der anderen muss
geändert werden, um diese Warnung zu beheben.
Aber Sie sehen, wie dies eine Warnung ist. Sie können dort immer noch
kompilieren, aber Mann, der wirklich Schnittprobleme in Ihrem Programm verursachen könnte.
Wenn Sie erwarten, dass eine Funktion etwas zurückgibt und dies nicht der Fall ist, möchten Sie Ihre
Warnungen nicht verwendete Variable eine weitere häufige Warnung korrigieren.
Dies wird vom Compiler gedruckt, wenn eine Variable deklariert wird, aber nie verwendet wird.
Sie sollten eine Variable nicht deklarieren, wenn Sie sie
nicht verwenden. Entfernen Sie diese Deklaration.
Ich neige dazu, diese ziemlich oft zu bekommen, wenn ich einige meiner Demos mache,
weil ich Variablen hinterlasse, die ich nie benutze.
Oder wenn ich demonstrierte, wie eine Variable deklariert wird, und sie dann
kompilierte, um Ihnen zu zeigen, dass sie kompiliert wurde, erhielt ich eine Warnung, dass sie nie verwendet wurde.
Das ist also okay, weil ich etwas demonstriert habe. Entfernen Sie jedoch Ihre
Variablen, wenn sie nicht verwendet werden. Keine Notwendigkeit zu deklarieren.
Unbestimmte Anspielung auf. Dies geschieht in der Verknüpfungsphase.
Denken Sie also an den Compiler oder die Kompilierungsphase, die kompiliert wird.
Zuerst wird der Präprozessor ausgeführt, dann werden die Objektdateien generiert, und dann werden diese Objektdateien
verwendet und miteinander verknüpft, um ein vollständiges Programm zu erstellen.
Während der Verknüpfungsphase müssen
daher alle externen Abhängigkeiten aufgelöst werden.
Oder speziell alle Funktionen, die Sie aufrufen,
müssen irgendwo implementiert werden.
Wenn diese Objektdatei nicht vorhanden ist, tritt dieses Problem auf.
Sie versuchen, eine Funktion aufzurufen, aber wir haben nicht den Code dafür.
Sie müssen also entweder sicherstellen, dass Sie auf
diese Datei verlinken.
Normalerweise geschieht die Verknüpfung
für Sie, aber in GCC können Sie einfach die Option Strich
l ausführen, um die Verknüpfungsdatei hinzuzufügen. Wenn Sie also eine Funktion in
der Mathe-Header-Datei verwenden, aber keine Verknüpfung zur Mathe-Objektdatei herstellen, wird dieser Fehler angezeigt.
Es kommt auch vor, wenn Sie benutzerdefiniert sind und
keine c-Quelldatei angegeben haben.
Sie haben also mehrere c-Quelldateien.
Eine der c-Quelldateien implementiert diese Funktion.
Eine andere C-Quelldatei enthält den Header und ruft ihn
auf. Sie haben
jedoch nie die andere C-Quelldatei kompiliert, in der die Implementierung vorhanden ist. Dieser
Fehler wird angezeigt.
Stellen Sie also sicher, dass Sie diese Quelldatei einbringen, und stellen Sie
sicher, dass Sie alle Standarddateien der Standardbibliothek einbringen, wenn Sie dies normalerweise explizit benötigen. Sie müssen dies nicht tun.
Ein weiterer häufiger Fehler ist, wenn Typen in Konflikt stehen.
In diesem Fall haben Sie tatsächlich einen Funktionsprototyp definiert oder deklariert, und als Sie ihn implementiert
haben, war er nicht derselbe, wie Sie ihn deklariert haben.
So hat der Prototyp beispielsweise einen Ergebnistyp und einen Namen in Klammern für die Parameter
und dann ein Semikolon.
Wenn Sie dann die Implementierung
definieren, haben Sie einen anderen tatsächlichen Funktionsheader.
Sie haben einen anderen Rückgabetyp oder eine andere Anzahl von Parametern.
Und das heißt gut, hey, Sie
haben diese eine Funktionsdeklaration. Und wenn Sie es unten implementieren, ist es völlig anders.
Es gibt also ein Missverhältnis.
Und dies zeigt Ihnen tatsächlich in der Zeile, dass der Konflikt in der
vorherigen Definition auftritt, die den Widerspruch verursacht hat.
In der Implementierung wird Ihnen normalerweise die Zeile angezeigt, da
Sie normalerweise Ihre Funktionen oben deklarieren.
Laufzeitfehler. Laufzeitfehler sind Probleme in Ihrem Code,
die auftreten, wenn Sie das Programm ausführen, nicht wenn Sie es kompilieren.
Dies sind also
normalerweise Abstürze oder nicht schwerwiegende Fehler, bei denen
das Array außerhalb der Grenzen liegt oder so etwas.
Wenn das Programm ausgeführt wird, liegt ein logischer Fehler vor.
Daher kann die Ausführung von c-Programmen abrupt mit einem Absturz beendet werden, wenn ein Laufzeitfehler
erkannt wird, der nicht behandelt werden kann. Es gibt eine Speicherbeschädigung, wie ich
bereits erwähnt habe.
Außerhalb der Grenzen führen Fehler normalerweise zum Absturz von Programmen.
Normalerweise sehen Sie einen Segmentierungsfehler.
Und Segmentierungsfehler sagen Ihnen eigentlich nichts.
Um dieses Problem weiter zu diagnostizieren, müssen Sie sich
normalerweise den Aufrufstapel ansehen, wie
bereits erwähnt, bevor das Programm zeilenweise abstürzt, um
festzustellen, welche Zeile den Absturz verursacht.
Sie können den Aufrufstapel erhalten, wenn es eine Kerndatei gibt, die ich zuvor erwähnt habe.
Und dann können Sie auf dem Aufrufstapel sehen, welche Leitung abstürzt.
Oder noch besser, führen Sie den Debugger Schritt für Zeile aus. Wenn Sie dann eine Zeile oder
einen Debugger ausführen, stürzt das Programm ab und Sie können es auf diese Weise identifizieren.
Dies sind also noch einmal einige
weitere Tipps zu Compilerfehlern, Warnungen und Meldungen und deren Interpretation.
Es gibt tatsächlich
Links online. Oder wenn
Sie googeln, wird Ihnen jeder einzelne Compilerfehler und jede Warnung
angezeigt, die erzeugt werden können, und es wird tatsächlich
definiert, warum dies erzeugt wurde und was
das Problem im Wesentlichen war.
Denn auch diese Kompilierungsfehler können sehr kryptisch sein.
Und selbst das eine Wort sagte
unerreichbare Kontrolle. Sie wissen aus dieser Beschreibung unbedingt,
es sei denn, Sie haben Erfahrung damit, das heißt, Sie geben niemals etwas von einer Funktion zurück.
Aber wenn Sie dies tun, ist eine der besten Möglichkeiten, Probleme in
Ihrem Programm zu finden und zu beheben, wenn Sie Compilerfehler haben und diesen Compiler
nicht verstehen, googeln Sie ihn. In der Regel wird ein Stapelüberlauf durchgeführt.
Und es wird Ihnen sagen, hey, das ist Ihr Fehler. So lösen
Sie ihn. Das mache ich bis heute.
Ich programmiere seit 15 Jahren in c, aber es gibt immer noch Zeiten,
in denen ich auf Dinge stoße, und ich bin der Meinung, was genau das bedeutet.
Und ich werde es googeln, ich werde den Compiler tatsächlich nehmen, ihn in Anführungszeichen setzen
und es wird mir genau sagen, was passiert.
Stack Overflow ist eine wirklich sehr gute Website.
Und es kann wirklich viel Zeit
beim Debuggen sparen. Versuchen Sie nicht nur zu raten, wenn Sie Compiler oder Warnungen sehen.
Dieser Compiler versucht, Ihnen etwas zu sagen, und er wird genau bestimmen, was los ist.
Wenn Sie es verstehen, können Sie Ihr Problem viel, viel schneller beheben.
Und wenn Sie damit nicht vertraut sind,
gehen Sie zum Stapelüberlauf oder besuchen Sie eine Website, die alle beschreibt, und Sie
können es auf diese Weise entschlüsseln.
Ich hoffe das war hilfreich. Vielen Dank.