if(1)
-
Hallo,
ich muss ein altes Programm analysieren. Dabei bin ich auf#define PRINT0(control) if (1) \ { \ fprintf(_outfile, "%5d ", _line_number++); \ print_nc_line_number(); \ fprintf(_outfile, control); \ } else #define PRINT1(control, arg1) if (1) \ { \ fprintf(_outfile, "%5d ", _line_number++); \ print_nc_line_number(); \ fprintf(_outfile, control, arg1); \ }
gestossen. Könnte mir jemand erklären was hier if(1) bedeutet?
Vielen Dank
-
Es könnte sein, dass in der If-Klausel früher mal etwas tatsächlich relevantes stand, was dann aber als Bedingung wegfiel.
-
if (1)
ist immer wahr, der folgende Block wird immer ausgeführt.Das wird gemacht, damit du jederzeit im Code
PRINT0(control);
schreiben kannst.PRINT0(control)
wird dann durch das if(1){....} ersetzt und dann kommt aber noch das ;Ohne das if würde sich der Compiler am ; hinter der } stören.
Mit if ist es (das ; ) nur eine leere Anweisung
-
@DirkB
Super Danke dir!!
-
Und zur Erklärung, warum die {} da sind, obwohl das wie von DirkB erklärt zu Problemen mit Semikolons führen kann. Das ist ganz wichtig für Fälle dieser Art:
if (irgendwas) PRINT0(control);
Ohne den if(1)-Block würde das zu
if (irgendwas) fprintf(_outfile, "%5d ", _line_number++); print_nc_line_number(); fprintf(_outfile, control);
Das wäre bestimmt nicht im Sinne des Programmierers. Mit dem if(1)-Block passiert das, was man erwartet.
-
#define PRINT0(control) if (1) \ { \ fprintf(_outfile, "%5d ", _line_number++); \ print_nc_line_number(); \ fprintf(_outfile, control); \ } else
Bist du sicher das hier ein else steht?
Denn so sieht es nach einem merkwürdigem Verhalten aus, wenn du das Makro ohne anschließendes Semikolon aufrufst.
z.B.
#include <cstdio> int _line_number = 0; #define PRINT0(control) if (1) \ { \ printf("%i ", _line_number++); \ printf(control); \ } else int main () { PRINT0("Hallo ") { printf("Welt\n"); } printf("Ende\n"); return 1; }
-
@DirkB Sicher? Ein einzelnes Semikolon ist doch auch ohne if nur ne leere Anweisung.
int a = 0; ; int b = 42;
kompiliert jedebnfalls problemlos. Ich sehe keine Grund warum sich der Compiler an den prints stören sollte.
-
@Quiche-Lorraine sagte in if(1):
Bist du sicher das hier ein else steht?
Ich bin zwar nicht @anpoit00 aber ich bin mir ziemlich sicher dass dort ein else steht.
Der Zweck ist vermutlich dass das richtig funktioniert:if (foo) PRINT0("bar"); else DannHaltNicht();
Was dagegen blöd würde ist wenn jemand das
;
vergisst und z.B. schreibt:PRINT0("Jetzt machen wir gleich ganz was wichtiges...") // ; vergessen -- OOPS MachGanzWasWichtiges(); PRINT0("Hurrah, fertig mit der ganz wichtigen Sache.");
Hier würde dann
MachGanzWasWichtiges();
in den else Zweig rutschen und es gäbe Aua.Die bessere Variante wäre das viel üblichere
do { ... } while (0)
.
Das funktioniert in if-else Konstrukten problemlos. Und wenn man das abschliessende;
vergisst, wie in dem Aua Beispiel oben, bekommt man hübsch nen Fehler gelemdet.
-
Was dagegen blöd würde ist wenn jemand das ; vergisst und z.B. schreibt:
Stimmt, habs gerade ausprobiert.
Nichtsdestotrotz fehlt da ein Semikolon. Und ich sehe vor meinem inneren Auge wie sich der Fehler fortpflanzt.
Und genau bei solchen Makros habe ich beschlossen so wenig Makros wie möglich einzusetzen.