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


  • Mod

    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.



  • @anpoit00 sagte in if(1):

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



  • @hustbaer sagte in if(1):

    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.


Anmelden zum Antworten