Forum: Mikrocontroller und Digitale Elektronik C code - if(); ohne nachfolgenden Inhalt wozu


von Verarschter (Gast)


Lesenswert?

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
1
if(x = 5)
2
{
3
     // do stuff
4
}

sinnvollerweise auch.

von Einer K. (Gast)


Lesenswert?

Eine leere Anweisung, ist eine gültige Anweisung.

Leere Anweisungen sind üblich.
Siehe: for(;;)

von Mike (Gast)


Lesenswert?

Nee ist doch dem Compiler egal. Solange er es übersetzen kann wird er 
dich nicht daran hindern, dummes zu tun.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Der GCC warnt, wenn man ihn – bspw. mit -Wextra – dazu veranlasst:

1
test.c:6:14: warning: suggest braces around empty body in an ‘if’ statement [-Wempty-body]
2
    6 |   if (x == 1);
3
      |              ^

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

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.

: Bearbeitet durch User
von MaWin (Gast)


Lesenswert?

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.

von Einer K. (Gast)


Lesenswert?

Welcher Politiker/Entscheider bremst dich bei der Wahl deiner 
Lieblingssprache aus?
Keiner?

Dann ist das Argument idiotisch.

von Thomas Z. (usbman)


Lesenswert?

Ich benutze solche Dinge manchmal in Verbindung mit Makro Tricks ist 
aber zugegebenermaßen nicht so schön. z.b mit Makros die zu nichts 
expandieren.

von Oliver S. (oliverso)


Lesenswert?

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

von X. Y. (Gast)


Lesenswert?

MaWin schrieb:
> Heute gibt es viele bessere Sprachen. Auch für Embedded.

Dann verrat uns bitte auch welche das sind.
LG

von C3P0 (Gast)


Lesenswert?

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

von Vincent H. (vinci)


Lesenswert?

Kleiner Tip am Rande. Sowas fällt viel eher auf wenn man Tools wie 
clang-format und clang-tidy nutzt.

von C3P0 (Gast)


Lesenswert?

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

von A. S. (Gast)


Lesenswert?

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.

von Dumdi D. (dumdidum)


Lesenswert?

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.

von Michael Gugelhupf (Gast)


Lesenswert?

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.

von C3P0 (Gast)


Lesenswert?

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

von C3P0 (Gast)


Lesenswert?

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

von Adam P. (adamap)


Lesenswert?

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.

von HildeK (Gast)


Lesenswert?

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.

von DPA (Gast)


Lesenswert?

Ich hab bei meinen Projekten zusätzlich zu den schon genannten noch 
-pedantic ond -std=c99 oder -std=c11.

von Hmmm (Gast)


Lesenswert?

C3P0 schrieb:
> Hat jemand eine Übersichtstabelle, welche Optionskombination die
> wichtigsten Optionen abdeckt

https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

von Oliver S. (oliverso)


Lesenswert?

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

: Bearbeitet durch User
von C3P0 (Gast)


Lesenswert?

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

von Rolf M. (rmagnus)


Lesenswert?

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.

von C3P0 (Gast)


Lesenswert?

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)


Lesenswert?

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

von Nop (Gast)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.