c++ compiling error trotz exaktem copy paste des code beispiels?

4 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

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.


x0RRY01 
Beitragsersteller
 09.02.2025, 00:27

ich habe mich nach der learncpp.com lesson "0.11 — Configuring your compiler: Warning and error levels" gerichtet und gemacht, was da gesagt wurde.

Kelec  09.02.2025, 00:36
@x0RRY01

Ja und da hast du ja schon deine Erklärung. Wenn du Treat Warning as Errors aktivierst dann wird eine Warnung auch als Error angezeigt und darum kannst du das Beispiel nicht kompilieren.

x0RRY01 
Beitragsersteller
 09.02.2025, 00:38
@Kelec

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?

Kelec  09.02.2025, 00:54
@x0RRY01

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.

Destranix  09.02.2025, 11:01
@x0RRY01

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.

x0RRY01 
Beitragsersteller
 09.02.2025, 18:29
@Destranix

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).

Kelec  09.02.2025, 18:44
@x0RRY01
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.

x0RRY01 
Beitragsersteller
 09.02.2025, 18:55
@Kelec
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!

Kelec  09.02.2025, 19:09
@x0RRY01

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.

Destranix  10.02.2025, 10:13
@x0RRY01
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.

Kelec  10.02.2025, 10:20
@Destranix

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.

x0RRY01 
Beitragsersteller
 15.02.2025, 01:45
@Kelec

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.

Kelec  15.02.2025, 19:45
@x0RRY01

Ich würde vorschlagen dass du erst mal einige c++ programme umsetzt bevor du an die Grafik gehst.

C++ würde ich aber auch nicht dafür wählen, da wäre eine fertige Grafikengine wie Unity (C#) besser.

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.


x0RRY01 
Beitragsersteller
 09.02.2025, 18:41
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.

KarlRanseierIII  09.02.2025, 19:29
@x0RRY01

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.


Kelec  09.02.2025, 00:15

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.

FreieFrage  09.02.2025, 16:14
@Kelec

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`.