web-dev-qa-db-fra.com

C Accolades après chaque cas

Dans un contrôle de flux C switch-case, il est nécessaire de mettre des accolades {} après une case si des variables sont définies dans ce bloc.

Est-ce une mauvaise pratique de mettre des accolades après chaque case, quelle que soit la déclaration de variable?

Par exemple:

switch(i) {
  case 1: {
    int j = 4;
    ...code...
  } break;

  case 2: {  //No variable being declared! Brace OK?
    ...code...
  } break;
}
37
Ben

Ce n'est certainement pas invalide d'utiliser des accolades dans tous les cas, et ce n'est pas nécessairement un mauvais style non plus. Si vous avez des blocs de casse avec des accolades en raison de déclarations de variable, l'ajout d'accolades aux autres peut rendre le style de codage plus cohérent.

Cela étant dit, ce n'est probablement pas une bonne idée de déclarer des variables à l'intérieur de blocs de casse en C droit. Cela pourrait être autorisé par votre compilateur, mais il existe probablement une solution plus propre. Des blocs de cas mutuellement exclusifs peuvent partager plusieurs variables temporaires communes ou vous pouvez penser que vos blocs de cas fonctionneraient mieux en tant que fonctions d'assistance.

37
bta

Les accolades peuvent être utilisées dans chaque déclaration de cas sans aucune pénalité liée à la vitesse, en raison de la façon dont les compilateurs optimisent le code. Donc, c'est juste le style et la préférence du codeur.

  • L’utilisation préférée n’est pas l’utilisation d’accolades, bien que leur utilisation dans tous les cas au cours d’un développement actif soit plus facile à effectuer pour ajouter de temps en temps quelques ajouts au code.

  • C'est juste l'esthétique; car une instruction 'case' n'a pas besoin d'une seule commande, mais parcourt le code car il fonctionne comme une étiquette. Donc, les blocs ne sont pas nécessaires et ne sont pas invalides.

  • Dans le cas des variables; les accolades sont utilisées au cas par cas, pour créer des contextes pour les variables, et il est logique de les utiliser. Certains compilateurs sur différentes plates-formes affichent des comportements différents s'ils ne sont pas inclus.

10
SuperDuck

En règle générale, il est recommandé de ne pas sauter l’initialisation d’une variable, que ce soit avec goto ou switch. C'est ce qui arrive quand vous n'avez pas les blocs par case.

Il y a même un cas dans C99 où sauter l'initialisation est illégal, à savoir des tableaux de longueur variable. Ils doivent être "construits" de la même manière que les non-PODs en C++, leur initialisation est nécessaire pour l'accès ultérieur à la variable. Donc, dans ce cas, vous devez utiliser l’instruction de bloc.

5
Jens Gustedt

J’estime qu’il est mauvais d’utiliser des accolades dans chaque case. Les cas sont des étiquettes en C, apparentées aux étiquettes goto. Et dans le langage C actuel, vous êtes libre de déclarer des variables dans chaque case (ou n'importe où vous préférez) sans introduire de nouveaux blocs, bien que certaines personnes (moi-même inclus) considèrent également que ce style est mauvais.

1
R..