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 ...
}
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.
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?
11464300cookie-checkIst if(TRUE) eine gute Idee in C?yes
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