Ist if(TRUE) eine gute Idee in C?

Lesezeit: 4 Minuten

Benutzer-Avatar
Tim

In der Programmiersprache C können Variablen meines Wissens nur am Anfang eines Codeblocks definiert werden, und die Variable hat den Gültigkeitsbereich des Blocks, in dem sie deklariert wurde. In Anbetracht dessen habe ich mich gefragt, ob dies der Fall ist Es wurde als schlechte Praxis angesehen, einen neuen Bereich wie in diesem Beispiel künstlich zu erstellen:

void foo()
{
     ... Do some stuff ...

     if(TRUE)
     {
         char a;
         int b;

         ... Do some more stuff ...
     }

     ... Do even more stuff ...
 }

Angenommen, TRUE ist in einer Makrodefinition auf 1 gesetzt, würde dieser Code dann als „guter Code“ betrachtet werden, oder lässt er erfahrene Programmierer schon beim bloßen Gedanken daran zusammenzucken?

Danke für deinen Beitrag!

BEARBEITEN: Als Antwort auf einige der Antworten muss der Code, mit dem ich arbeite, mit einigen ziemlich alten Legacy-Systemen funktionieren. Obwohl es schön wäre, mit einer Annahme von C99 zu operieren, können wir wirklich nicht garantieren, dass sie es haben werden.

  • afaik, {} hat seinen eigenen Geltungsbereich sine ansi C (das ist circa 1990)

    – George

    12. Februar 2009 um 15:32 Uhr

  • Der typische Anwendungsfall dafür ist das Debuggen, bei dem Sie einfach zwischen if (42) und if (0) wechseln können, anstatt zu kommentieren.

    – ypnos

    12. Februar 2009 um 15:33 Uhr

  • Ihr Titel beschreibt die Frage überhaupt nicht wirklich. Es scheint, als wollten Sie fragen, ob es eine gute Praxis ist, TRUE zu definieren.

    – Bobby Shaftoe

    13. Februar 2009 um 0:19 Uhr

Sie brauchen nicht einmal eine if-Anweisung. Sie können Blöcke mit {} erstellen

Das sollte aber wohl eine eigene Funktion sein.

Beispiel hier:

#include <stdio.h>

int
main(int argc, char **argv) {
    int i = 0;
    {
        int i = 10;
        printf("%d\n", i);
    }
    printf("%d\n", i);
}

  • Wird dies jemals im Produktionscode verwendet? Mein Gedanke ist, dass ich Zugriff auf alle Variablen in der vorhandenen Funktion haben möchte, aber einige neue Variablen gelten nur für einen kleinen Abschnitt. Eine Funktion würde bedeuten, dass ich eine ganze Reihe von Variablen übergeben und die Variablen zur Hauptdatei hinzufügen müsste …

    – Tim

    12. Februar 2009 um 15:21 Uhr

  • … Funktion würde die vorhandenen Variablen der Funktion überladen

    – Tim

    12. Februar 2009 um 15:22 Uhr

  • Mein Unternehmen nutzt dies ausgiebig. Als ich anfing, hier zu arbeiten, war ich eigentlich dagegen, aber jetzt gefällt es mir. Ich mag die Art und Weise, wie wir es verwenden, immer noch nicht, nämlich Teile von 1000 Zeilenfunktionen aufzubrechen, die ihre eigene Funktion sein sollten …

    – rméador

    12. Februar 2009 um 15:23 Uhr

  • Scoping ist eine nette Sache, ich nutze es auch eher. Variablen mit demselben Namen spiegeln .. nicht so sehr 😉

    – ypnos

    12. Februar 2009 um 15:32 Uhr

  • In C++ (anstelle von C) wird dies häufig verwendet. Ein gängiges Beispiel wäre eine Sperrklasse für einen Mutex, die den Mutex in seinem Konstruktor sperrt und ihn in seinem Destruktor entsperrt. Das Erstellen einer Sperrvariablen auf dem Stack schützt dann einen kritischen Abschnitt mit demselben Geltungsbereich wie der Block.

    unwesentlich

    12. Februar 2009 um 16:48 Uhr

Soweit ich weiß, können Sie einen Bereich ohne if erstellen.

Verwenden Sie nur die geschweiften Klammern wie folgt:

{
    int x;

}

Und ich rate davon ab

if (TRUE)

da es die Lesbarkeit behindert.

  • vor allem, wenn Sie TRUE 0 #definieren

    – Peter Kirkham

    12. Februar 2009 um 15:44 Uhr

Sie möchten wahrscheinlich eine neue Funktion für diesen Bereich erstellen.
Wenn es wirklich einen eigenen Bereich haben muss, ist es wahrscheinlich sowieso eine separate logische Funktion.

  • Nicht unbedingt. Ich bin oft auf die Notwendigkeit gestoßen, eine sehr lokale Variable (mit einem netten mnemonischen Namen) zu benötigen, um einen Zwischenwert für nur ein paar Zeilen zu halten. Durch die Verwendung eines verschachtelten Geltungsbereichs machen Sie dessen beabsichtigte (eingeschränkte) Verwendung deutlich.

    – joel.neely

    13. Februar 2009 um 0:38 Uhr

Da Sie den Scope-Block einfach ohne das if erstellen können, ist das eine bessere Idee.

void foo() {
     ... Do some stuff ...
     {
         char a;
         int b;
         ... Do some more stuff ...
     }
     ... Do even more stuff ...
}

Benutzer-Avatar
sternenblau

Beachten Sie, dass es in C99 erlaubt ist, lokale Variablen in der Mitte von Blöcken zu deklarieren.

C99 ist die Version des C-Standards aus dem Jahr 1999; Die meisten modernen C-Compiler unterstützen dies.

Zunächst einmal muss ein neuer Block kein if-Block sein. Es könnte einfach ein Codeabschnitt sein, der von geschweiften Klammern umgeben ist, wie dieser:

void foo() {
 ... Do some stuff ...

 {
     char a;
     int b;

     ... Do some more stuff ...
 }

 ... Do even more stuff ...
}

Zweitens können Sie in jedem modernen C-Compiler, der dem C-Standard entspricht (ich denke C99), überall im Block Variablen deklarieren, sodass Sie überhaupt keinen neuen Block erstellen müssen.

Benutzer-Avatar
Markus Pim

Sie können die entfernen

if(TRUE)

und lassen Sie einfach die geschweiften Klammern, die für sich genommen einen neuen syntaktischen Block definieren – a Zusammengesetzte Aussage.

Das ist definitiv sauberer als das Falsche, wenn Sie es vorher getan hätten, aber Sie fragen sich vielleicht trotzdem, warum Sie einen neuen Block erstellen möchten – wäre es besser, eine Subroutine zu definieren?

1146430cookie-checkIst if(TRUE) eine gute Idee in C?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy