Nachdem ich gerade über meine eigene Blödheit von vor 2 Wochen
gestolpert bin frage ich micht, wozu in C die folgenden Zeile gut sein
könnten:
1
if(x==1);
2
printf("Should only be printed if x is 1!");
Dadurch, dass ich versehentlich die Zeile mit der if-Anweisung mit einem
Semikolon abgeschlossen habe wird sie de facto ignoriert. Wozu lässt C
also so etwas überhaupt zu? Gibt es dafür eine sinnvolle Anwendung?
Eigentlich hätte ich erwartet, dass der Compiler zumindest eine Warnung
ausspuckt (macht er ja bei Dingen wie
Verarschter schrieb:> Eigentlich hätte ich erwartet, dass der Compiler zumindest eine Warnung> ausspuckt
Auf was soll die Warnung denn basieren? Die Syntax der if-Anweisung
lautet:
if (EXPRESSION) statement;
auch eine Leer-Anweisung (null-statement) ist syntaktisch korrekt ein
statement. Also gibt es für den Compiler nix zu meckern.
-> Da musst du schon zuvor den do-what-i-mean Präprozessor laufen
lassen, damit dieser an verschiedenen Stellen eine Fehlermeldung nach
deinem Wunsch ausgibt. Leider gibt es diesen Präprozessor nur bei ganz
wenigen C-Implementationen.
Mike schrieb:> wird> er dich nicht daran hindern, dummes zu tun.
Und das ist das Dumme an C.
Heute gibt es viele bessere Sprachen. Auch für Embedded.
Es ist hier wie in der Politik: Solange die Entscheidungsträger
mittelalterliche Vorstellungen haben, wird Fortschritt ausgebremst.
Yalu X. schrieb:> Der GCC warnt, wenn man ihn – bspw. mit -Wextra – dazu veranlasst:
Und wenn man das printf ordnungsgemäß eingerückt hätte, gäbs dazu auch
noch eine Warnung.
Oliver
C ist halt "historisch gewachsen".
Neuere Compiler lassen sich oft Zusatzschalter wie oben nutzen um solche
Warnungen zu generieren. Alternativ bieten sich Tools zur statischen
Codeanalyse an (Splint, ...)
>Thomas Z. schrieb>Ich benutze solche Dinge manchmal in Verbindung mit Makro Tricks...
Ja geht zur Not auch, aber an der wichtigen Stelle vergisst man es
wieder...
Zumindest einmal am Ende sollte man ein Projekt mit
GCC Optionen "-Wall -Wextra -Wshadow" compilieren und
sich freuen wenn man außer natürlichen einigen unkritischen Sachen auch
richtige Leichen im Keller findet....
Ich verstehe das genöhle nicht. C bietet trotz kleiner Spezifikation
viele Möglichkeiten. Eben weil die Regeln allgemeinen gelten.
Wie Komplex sollte der Compiler sein, um zu erkennen, was ich will.
Wenn man Hosenträger will, nimmt man Warnungen und lint.
Der Grund ist der gleiche warum C damals auf fast alle Platformen
portiert wurde: C wurde so konzipiert, dass es (relativ) einfach ist
eine Compiler zu schreiben, und nicht das es einfach ist damit zu
programmieren.
A. S. schrieb:> Ich verstehe das genöhle nicht.
Ach, dies Meckerer über C sind schon lustig. Auf der einen Seite meckern
sie dass C so altmodisch ist. Auf der anderen Seite scheinen sein keine
modernen Entwicklungswerkzeuge zu verwenden und scheinen in der
Steinzeit von ed und edlin festzustecken.
Frage: in der Diskussion bin ich wieder drüber gestolpert, dass -Wall ja
nicht alle Warnings in GCC aktiviert. Bei den vielen nicht gesetzten
Schaltern verliert man gerne den Überblick.
Hat jemand eine Übersichtstabelle, welche Optionskombination die
wichtigsten Optionen abdeckt, ohne Mehrfachnennung der Optionen wie bei
-Wall -Wextra -Wunused-variable -Wshadow
(-Wunused-variable ist bereits in -Wall aktiv...)
Michael Gugelhupf schrieb:> A. S. schrieb:>> Ich verstehe das genöhle nicht.> Ach, dies Meckerer über C sind schon lustig...
Das ist wie bei einem alten Auto....
die Karre klappert, ölt, könnte weniger verbrauchen...
aber ich liebe sie und sie ist viel flexiebler als die topmodernen
Dinger,
bei denen ich nicht einmal das Radio anmachen kann, ohne den
Sicherheitsgurt zu benutzen...
C3P0 schrieb:> -Wextra
Hab ich grad mal über ein fertiges Projekt laufen lassen ;-)
Ansich alles top, bis auf ein paar "unused paramter" (nicht weiter
kritisch).
Hatte ich bis jetzt nie verwendet, find ich gut :) danke.
Verarschter schrieb:> Eigentlich hätte ich erwartet, dass der Compiler zumindest eine Warnung> ausspuckt (macht er ja bei Dingen wie
if(x = 5)
> {> // do stuff> }>> sinnvollerweise auch.
Er warnt dich doch hier, weil du in der Bedingung eine Zuweisung hast
(X=5) anstatt eines Vergleichs (x==5)? Sonst ist ihm dies auch egal -
wird einfach weg optimiert.
C3P0 schrieb:> at jemand eine Übersichtstabelle, welche Optionskombination die> wichtigsten Optionen abdeckt,
Achtung, geheim:
https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
Wenn du nicht auf nicht-ISO-konforme Erweiterungen angewiesen bist, nimm
-Wall -Wextra -Wpedantic
Oliver
Oliver S. schrieb:> Achtung, geheim:> https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
Logisch, die Seite kenne ich. Aber es ist etwas fummelig, immer zu
prüfen, ist eine Option bereits in -Wall -Wextra ... versteckt.
> Wenn du nicht auf nicht-ISO-konforme Erweiterungen angewiesen bist, nimm> -Wall -Wextra -Wpedantic
Mir geht es nicht um ISO Konformität, sondern um Fehleraufdeckung.
-Wshadow ist z.B. auch sehr sinnvoll und nicht enthalten.
Vielleicht setzt ich mich dochmal hin und bau eine Tabelle,
über die man einfach sieht, welche Flags wo zusammengefasst sind.
Was ich auch öfters genutzt habe:
https://stackoverflow.com/questions/2408038/what-does-wall-in-g-wall-test-cpp-o-test-do/12247461#12247461
C3P0 schrieb:>> Wenn du nicht auf nicht-ISO-konforme Erweiterungen angewiesen bist, nimm>> -Wall -Wextra -Wpedantic> Mir geht es nicht um ISO Konformität, sondern um Fehleraufdeckung.
Das kommt ja nun drauf an, ob du einen nicht ISO konformen Konstrukt als
Fehler siehst oder nicht. Ich nehme immer als Minimum -std=c11
-Werror=pedantic -Wall -Wextra.
> -Wshadow ist z.B. auch sehr sinnvoll und nicht enthalten.>> Vielleicht setzt ich mich dochmal hin und bau eine Tabelle,> über die man einfach sieht, welche Flags wo zusammengefasst sind.
Aber das steht doch auf der oben genannten Seite in der gcc-Doku und
> Was ich auch öfters genutzt habe:> https://stackoverflow.com/questions/2408038/what-does-wall-in-g-wall-test-cpp-o-test-do/12247461#12247461
dort auch - kopiert aus der gcc-Doku.
Rolf M. schrieb:> Aber das steht doch auf der oben genannten Seite in der gcc-Doku und
Ja, dass weiss ich. Um den Umfang der Compilerflags klein zu halten,
wollte ich nur die Flags explizit eintragen, die nicht in den
Summenschalter -Wall etc.. drin sind. Bisher hab ich halt alle quer
geprüft.
Hatte die Hoffnung es gibt eine Tabelle in der alle Schalter drin stehen
mit der Option zu filtern.
> von MaWin (Gast) 19.05.2020 12:29
Mal wieder nicht meine Meinung, sondern ein Beitrag vom Psychopathen,
der seinen Namen nicht kennt und stattdessen MaWin ins Namensfeld
schreibt.
C3P0 schrieb:> Mir geht es nicht um ISO Konformität, sondern um Fehleraufdeckung.>> -Wshadow ist z.B. auch sehr sinnvoll und nicht enthalten.
-Wlogical-op ist ebenfalls empfehlenswert.