c++ compiling error trotz exaktem copy paste des code beispiels?
okay, also mit dem Codebeispiel „Nicht-Boolesche Bedingungen“ scheint etwas nicht zu stimmen, denn es gibt mir einen compiler error, selbst wenn ich den exakten Code von hier kopiere und einfüge.
hier ist der Fehler, den der compiler anzeigt:
error C2220: the following warning is treated as an error
warning C4127: conditional expression is constant
consider using 'if constexpr' statement instead
die Lösung hierfür war, von x64 auf x84 modus umzuschalten.
das Seltsame daran ist, dass ich noch keine dieser Plattformen berührt habe.
das zweite Codebeispiel „If-Anweisungen und frühe Rückgaben“ darunter (als auch die ganzen letzten Codebeispiele von den vorherigen Chapters funktioniert auch einwandfrei mit x64, nur das erwähnte Codebeispiel funktioniert nicht mit x64, sondern nur mit x84.
der compiler sagt in der error nachricht, dass man 'if constexpr' statement benutzen soll, allerdings wird das im Codebeispiel nicht gezeigt.
4 Antworten
Der Code stimmt so an sich auch und lässt sich auch kompilieren.
Das Warning stimmt so, aber es wird als Error gewertet. Hast du eventuell die Compileroption werror verwendet? Die macht aus jedem warning einen error.
stimmt! ich habe es gerade ausprobiert und es funktioniert, danke! =)
PS: ist es für "best practice" empfohlen, diese einstellungen, wie in dieser lesson gezeigt, anzulassen oder wieder zu deaktivieren, oder welche einstellungen sollte man an- und welche aus lassen?
Es ist generell schon best practice aber du musst sie nicht verwenden und manchmal kannst du sie nicht verwenden, so wie für dieses Beispiel.
Es gibt jetzt keinen Satz von Compileroptionen die immer und überall zu empfehlen sind, am Ende richtet es sich nach der Aufgabe.
Meistens aktiviere ich für mich selbst alle Warnings und gehe sie durch bis alle Warnings weg sind außer jene die Garantiert keinen Fehler darstellen.
Du lässt sie an, möglichst dauerhaft.
Wenn du eine Wranung bekommst, dann passt irgendetwas iM Code meistens nicht. Das solltest du beheben.
Nur in wenigen Fällen ist eine Warnung nicht sinnvoll behebbar. Dnan kann man Die Warnung aber oftmals auch nur an eben dieser Stelle deaktivieren, wo der Fehler auftritt.
Im vorliegenden Codebeispiel ist das Problem, dass die Bedingung in der If-Anweisung konstant und schon uur Compilezeit berechenbar ist.
Um Fehler zu vermeiden solltest du da "if constexpr" verwenden, also explizit schreiben, dass dir das bewusst ist.
grundsätzlich stimme ich deinem kommentar zu, aber:
Wenn du eine Wranung bekommst, dann passt irgendetwas iM Code meistens nicht. Das solltest du beheben.
wie ich in meiner recherche gerade noch gelesen habe, gibt es offenbar auch "gutartige" error, wie zb auch in meinem fall hier, wo man dann die "Treat Warning as Errors" deaktivieren muss, damit man den code kompilieren kann.
Um Fehler zu vermeiden solltest du da "if constexpr" verwenden, also explizit schreiben, dass dir das bewusst ist.
laut dem Codebeispiel muss man das aber nicht(es wird ja auch nicht mal irgendwas erwähnt, dass das probleme mit dieser "Werror" einstellung machen könnte), da ist es dann völlig egal, was im error steht.
das Codebeispiel ist ja dafür da, um das zu lernen und auszuführen, was da gerade steht - andere leser dieses kurses werden bestimmt dasselbe wiederlaufen haben, dass sie das Codebeispiel nicht kompilieren können wegen dieser Werror einstellungen, in meinem fall hab ich es dann auch ohne das deaktivieren der Werror einstellung geschafft den code zu kompilieren, indem ich einfach von 64x auf 84x umgeschaltet habe(wovon ebenfalls nichts in diesem Codebeispiel stand).
wie ich in meiner recherche gerade noch gelesen habe, gibt es offenbar auch "gutartige" error
Naha fertiger Code sollte auch keine Warnings haben das stimmt schon.
laut dem Codebeispiel muss man das aber nicht(es wird ja auch nicht mal irgendwas erwähnt, dass das probleme mit dieser "Werror" einstellung machen könnte), da ist es dann völlig egal, was im error steht.
In dem Fall ist der Fehler dass hier eine Konstante steht.
Ein so ein If macht ja auch keinen Sinn, aber es kann in Verbindung mit Templates Sinn machen aber es sollte dann eben if constexpr sein und nicht nur if.
Das Problem hier ist dass die Konstante lediglich ein Platzhalter ist.
Im Produktiven Einsatz sollte in diesem Fall, wie hier, immer if constexpr stehen.
Es macht auch keine Probleme mit WError , wenn der Code keine Warnung erzeugt, das Beispiel ist nur etwas schlecht gewählt weil der Compiler hier zurecht diese Warnung schreibt.
In dem Fall ist der Fehler dass hier eine Konstante steht.
Ein so ein If macht ja auch keinen Sinn, aber es kann in Verbindung mit Templates Sinn machen aber es sollte dann eben if constexpr sein und nicht nur if.
Das Problem hier ist dass die Konstante lediglich ein Platzhalter ist.
Im Produktiven Einsatz sollte in diesem Fall, wie hier, immer if constexpr stehen.
ja, das wusste ich nicht, vlt wird das ja noch in späteren chapters nochmal erklärt.
ich hab ja auch noch gar nichts über "const" an sich gelernt oder gehört.
aber trotzdem danke für deine/eure erklärungen!
Naja einfach gesagt const ist eine Variable welche nur Initialisiert werden kann aber ihr kann kein Wert mehr zugeordnet werden.
constexpr steht für Constant Expretion und ist etwas anderes. Es ist nicht nur ein nicht veränderlicher Ausdruck sondern ein Ausdruck welcher der Compiler bereits berechnet.
Also if constexpr hat den Effekt dass der Compiler hier den Pfad welcher genommen wird direkt kennt und im kompilierten Programm steht dann gar kein if mehr drinnen sondern nur der Pfad der gewählt wird.
wie ich in meiner recherche gerade noch gelesen habe, gibt es offenbar auch "gutartige" error, wie zb auch in meinem fall hier, wo man dann die "Treat Warning as Errors" deaktivieren muss, damit man den code kompilieren kann.
Das sind die sogenannten Warnings. Die richtige Lösung ist aber zumeist nicht das ignorieren dieser sondern das Beheben der Ursache der Warning.
laut dem Codebeispiel muss man das aber nicht
Das Codebeispiel hat das dann halt nicht so genau genommen oder war sich dem nicht bewusst oder es gab die Warning zum Beispiel nicht, als das Codebeispiel geschreiben wurde oder es wurde mit einem anderen Compiler compiliert, der andere Warnungen ausgibt.
das Codebeispiel ist ja dafür da, um das zu lernen und auszuführen, was da gerade steht
Das stimmt. Wenn du die Urscahe der Warning nicht ohne weiteres beheben kannst, dann kann es auch sinnvoll sein, die erst einmal zu ignorieren und dich noch nicht wieter dmait zu beschäftigen.
Im Generellen wäre es aber das beste zu versuchen zu verstehen, wieso diese Warning kommt und dann entsprechend damit umzugehen.
in meinem fall hab ich es dann auch ohne das deaktivieren der Werror einstellung geschafft den code zu kompilieren, indem ich einfach von 64x auf 84x umgeschaltet habe(wovon ebenfalls nichts in diesem Codebeispiel stand).
Vermutlich hat die andere Compile-Einstellung dann zu anderen Warnungen geführt oder das "werror" implizit deaktiviert.
ich hab ja auch noch gar nichts über "const" an sich gelernt oder gehört.
Dann ist es natürlich umso schwerer dann zu analysieren, woher der Fehler kommt, zumal "const" auch noch einmal etwas anderes als "constexpr" ist.
Um es kurz zu halten: "constexpr" ist im wesentlichen jeder Ausdruck, den der Compiler bereits zur compilezeit vollständig auswerten kann.
Das Schlüsselwort wird aber in verschiedenen Kontexten verwendet und bedeutet je nach Kontext auch wieder etwas anderes.
Generell hilfreich, zum genauen nachlesen die cppreference:
https://en.cppreference.com/w/cpp/language/constexpr
Hat auch Infos für viele andere Dinge. Ist aber mehr für fortgeschrittene.
Du als Anfänger kannst da aber unter Umständen nachlesen, was Funktionen genau tun oder welche Funktionen zur Verfügung stehen.
Das lustige an constexpr ist dass es Funktionen generieren kann die nicht zur Kompilezeit auswertbar sind weil sie zB von Variablen abhängen.
Da wird constexpr einfach nur zu Inline.
Daher wurde in C++20 auch consteval eingeführt.
Leichter verständlich macht es das natürlich nicht.
welche graphics API für 2D development sollte man am anfang nach diesem c++ kurs am ehesten verwenden? (ich möchte zuerst mit 2D game development starten bevor ich mit 3D game development anfange.)
vom namen her kenne ich OpenGL, Vulkan, SDL und SFML aber habe noch keine erfahrung mit irgend einer framework davon.
error C2220: the following warning is treated as an error
Die folgende Warnung wird als Fehler bewertet. Der verwendete Compiler hat daafür eine entsprechende Kommandozeilenoption. Die Option kann je nach Compiler auch standardmässig aktiviert sein.
warning C4127: conditional expression is constant
Er warnt, daß ein Konstanter, also unveränderlicher) Ausdruck im If steht, der immer wahr (oder falsch) ist und einer der Zweige daher nie ausgeführt wird (unreachable ist). Solche Hinweise sind wichtig, da man gelegentlich Situationen hat in denen man den const nicht ohne weiteres erkennt.
consider using 'if constexpr' statement instead
Hier noch ein Lösungsvorschlag.
Hier noch ein Lösungsvorschlag.
der lösungsvorschlag ist in diesem fall aber völlig egal, weil eben nichts(weder von diesem lösungsvorschlag(als grundsätzliche implementierung in den code), noch von einem compiler error(der in diesem fall mit der "Werror" einstellung auftreten wird) davon in diesem Codebeispiel erwähnt wurde.
Der Lösungsvorschlag wird ja auch von diesem konkreten Compiler gemacht.
Die andere Frage wäre natürlich, ob das Codebeispiel bei diesen Flags und dieser Compilerversion so vorgesehen wurde.
Grundlegend: Sprachstandards legen alles zur Sprache fest, wobei einige Teile dem Implementierer überlassen weden. Alles weitere, wie Optionsnamen und deren Wirkung ist sowieso grundsätzlich dem Compiler ansich überlassen (sofern nicht explizit vom Standard gefordert).
Die Fehlermeldung sagt es dir. Im Internet gibt es haufenweise falsche Code-Beispiele, also ich würde auf dem Compiler hören und mich freuen, dass es bei den restlichen Beispielen geklappt hat.
Im Normalfalls wirst du an der Stelle sowieso eine Variable oder Bedingung haben, von daher finde ich es eher irrelevant für die Praxis, dass sich der Compiler von der Konstante beschwert.
Er gibt nur eine Warnung aus, was auch sinnvoll ist weil es auf einen Fehler im Programm hinweisen kann.
Ich glaube dass hier zusätzlich eine Option aktiviert ist die aus einem Warning einen Error macht.
Ja, das sagt auch die Fehlermeldung. Wenn du sie 1:1 in Google eingibst, kriegst du gleich die Info, wie du das änderst. Ich empfehle dir die Vorgehensweise für die Zukunft. Hier ist der erste Treffer: https://learn.microsoft.com/en-us/cpp/error-messages/compiler-errors-1/compiler-error-c2220?view=msvc-170
Sorry, ich hatte das als Anmerkung vom Fragenden wahrgenommen und war etwas irritiert.
Ich kann Dir nur das Problem allgemein beschreiben, die Lösung mußt Du dann in Deiner Compilerdoku selbst nachschlagen.
Du hast vereinfacht folgenden code
if (4)
bla
else
blub
egal wie oft du das Programm durchlaufen läßt, es wird immer bla rauskommen, denn die Bedingung Deines ifs ist konstant 4. Damit ist es hier überflüssig überhaupt ein if-else-statement zu nehmen, und das sagt der Compiler dir auch mit warning `C4127: conditional expression is constant`. Das ist aber erstmal nur eine Warning. Du hast noch irgendeine compiler option an, die diese Warning zu einem error macht: `error C2220: the following warning is treated as an error`.
ich habe mich nach der learncpp.com lesson "0.11 — Configuring your compiler: Warning and error levels" gerichtet und gemacht, was da gesagt wurde.