213 votes

Inutiles des accolades en C++ ?

Lors d'une revue de code pour un collègue aujourd'hui j'ai vu un drôle de chose. Il avait entouré son nouveau code avec des accolades comme ceci:

Constructor::Constructor()
{
   existing code

   {
      New code: do some new fancy stuff here
   }

   existing code
}

Quel est le résultat, le cas échéant, à partir de cela? Quelle pourrait être la raison pour cela? D'où vient cette habitude de venir?

Edit:

Sur la base d'informations et de certaines des questions ci-dessous, je sens que je dois ajouter un peu à la question, même si je l'ai déjà marqué une réponse.

L'environnement est d'appareils embarqués. Il y a beaucoup de legacy code C enveloppé dans du C++ vêtements. Il y a beaucoup de C tourné les développeurs C++.

Il n'y a pas de sections critiques dans la présente partie du code. J'ai seulement vu dans cette partie du code. Il n'existe pas de grandes allocations de mémoire en fait, juste quelques indicateurs qui sont définis, et un peu tourner.

Le code qui est entouré par des accolades est quelque chose comme:

{
   bool isInit;
   (void)isStillInInitMode(&isInit);
   if (isInit) {
     return isInit;
   }
}

(Ne me dérange pas le code, il suffit de coller à l'accolades... ;) ) Après les accolades il y a encore peu tourner, vérification d'état et de signalisation de base.

J'ai parlé au gars et sa motivation était de limiter la portée des variables, en nommant les affrontements, et quelques autres que je ne pouvais pas vraiment prendre.

De mon POV cela semble assez étrange et je ne pense pas que les accolades doivent être dans notre code. J'ai vu quelques bons exemples dans toutes les réponses sur pourquoi on pourrait entourer le code avec des accolades, mais ne devriez-vous pas séparer le code en méthodes à la place?

317voto

unwind Points 181987

Il est parfois agréable car il vous donne un nouveau champ d'application, où vous pouvez en plus "proprement" déclarer de nouvelles (automatique) des variables.

En C++ c'est peut-être pas si important puisque vous pouvez introduire de nouvelles variables n'importe où, mais peut-être que l'habitude est de C, où vous ne pouvez pas faire cela jusqu'à ce que le C99. :)

Depuis C++ a destructeurs, il peut également être pratique d'avoir les ressources (fichiers, mutex, peu importe) automatiquement libéré que le champ d'application des sorties, ce qui peut rend la chose plus propre. Cela peut signifier que vous pouvez accrocher à certaines ressources partagées pour une plus courte durée que vous feriez si vous aviez attrapé au début de la méthode.

180voto

ruakh Points 68789

Un des objectifs possibles est à portée variable de contrôle. Et puisque les variables avec mémorisation automatique sont détruits lorsqu’ils sont hors de portée, cela peut aussi permettre un destructeur d’être appelé plus tôt qu’il aurait autrement.

104voto

Nawaz Points 148870

L'extra accolades sont utilisées pour définir la portée de la variable déclarée à l'intérieur des accolades. Il est fait de sorte que le destructeur sera appelé lorsque la variable est hors de portée. Dans le destructeur, vous pouvez libérer un mutex (ou toute autre ressource), de sorte que d'autres pourraient l'acquérir.

Dans mon code, j'ai écrit quelque chose comme ceci :

void f()
{
   //some code - MULTIPLE threads can execute this code at the same time

   {
       scoped_lock lock(mutex); //critical section starts here

       //critical section code
       //EXACTLY ONE thread can execute this code at a time

   } //mutex is automatically released here

  //other code  - MULTIPLE threads can execute this code at the same time
}

Comme vous pouvez le voir, de cette façon, vous pouvez utiliser scoped_lock dans une fonction, et dans le même temps, peut définir son champ d'application, en utilisant des accolades. Cela permet de s'assurer que même si le code en dehors de la supplémentaires de l'appareil peut être exécuté par plusieurs threads simultanément, le code entre les accolades sera exécutée par un seul thread à la fois.

58voto

Ira Baxter Points 48153

Comme d'autres l'ont souligné, un nouveau bloc introduit un nouveau champ d'application, qui permet d'écrire un peu de code avec ses propres variables qui ne sont pas trash de l'espace de noms du code environnant, et de ne pas utiliser les ressources plus longtemps que nécessaire.

Cependant, il y a une autre belle raison pour cela.

C'est simplement pour isoler un bloc de code qui permet d'obtenir un particulier (sous -) objet. Il est rare qu'une seule instruction réalise un calcul de l'effet que je veux; en général, il faut plusieurs. Les placer dans un bloc (avec un commentaire) me permet de dire au lecteur (souvent moi-même à une date ultérieure):

  • Ce morceau a une cohérence conceptuelle but
  • Voici tout le code nécessaire
  • Et voici un commentaire à propos de la partie.

par exemple

{  // update the moving average
   i= (i+1) mod ARRAYSIZE;
   sum = sum - A[i];
   A[i] = new_value;
   sum = sum + new_value;
   average = sum / ARRAYSIZE ;  
}

Vous pourriez dire que je devrais écrire une fonction pour faire tout ça. Si je ne le faire une fois, l'écriture d'une fonction seulement ajoute de la syntaxe et les paramètres; il semble y avoir peu de point. Il suffit de penser à cela comme un sans paramètre, la fonction anonyme.

Si vous êtes chanceux, votre éditeur aura un pliage/dépliage de la fonction qui vous permettra même de masquer le bloc.

Je le fais tout le temps. C'est un grand plaisir de savoir les limites de ce que le code que j'ai besoin d'inspecter, et encore mieux de savoir que si ce morceau n'est pas celle que je veux, je n'ai pas regarder toute les lignes.

24voto

arne Points 2300

Une raison pourrait être que la durée de vie de toutes les variables déclarées dans le nouveau bloc d’accolades se limite à ce bloc. Une autre raison qui vient à l’esprit est d’être capable d’utiliser le code pliage dans l’éditeur favori.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X