46 votes

Quel est le but des blocs anonymes {} dans les langages de style C?

A quoi servent les blocs {} anonymes dans les langages de style C (C, C ++, C #)

Exemple -

 

void function()
{

  {
    int i = 0;
    i = i + 1;
  }

  {
    int k = 0;
    k = k + 1;
  }

}

 

Edit - Merci pour toutes les excellentes réponses!

79voto

17 of 26 Points 15941

Il limite la portée des variables au bloc à l'intérieur du {}.

21voto

Andrew Grant Points 35305

Les parenthèses désignent un champ d'application - tout ce qui est déclaré entre parenthèses est invisible en dehors d'eux.

De plus, en C ++, un objet alloué sur la pile (sans utiliser «new», par exemple) sera détruit lorsqu'il sortira de la portée.

Dans certains cas, cela peut également être un moyen de mettre en valeur un élément particulier d’une fonction que l’auteur juge digne d’attention pour les personnes qui consultent la source. Que ce soit un bon usage ou non est discutable, mais je l'ai vu faire.

16voto

Martin Cote Points 12762

Ils sont souvent utiles pour les besoins RAII , ce qui signifie qu'une ressource donnée sera libérée lorsque l'objet sortira de son champ d'application. Par exemple:

 void function()
{
    {
        std::ofstream out( "file.txt" );
        out << "some data\n";
    }
    // You can be sure that "out" is closed here
}
 

7voto

Adam Rosenfield Points 176408

Une autre utilisation courante concerne les fonctions glPushMatrix() et glPopMatrix() d’OpenGL permettant de créer des blocs logiques relatifs à la pile de matrice:

 glPushMatrix();
{
    glTranslate(...);
    glPushMatrix();
    {
        glRotate(...);
        // draw some stuff
    }
    glPopMatrix();
    // maybe draw some more stuff
}
glPopMatrix();
 

7voto

{ ... } ouvre un nouveau champ d'application

En C++, vous pouvez les utiliser comme ceci:

void function() {
    // ...
    {
        // lock some mutex.
        mutex_locker lock(m_mutex);
        // ...
    }
    // ...
}

Une fois le contrôle passe de l'édifice, le mutex locker est détruit. Et dans son destructeur, il serait automatiquement déverrouille le mutex qu'il est connecté à. C'est très souvent fait, et est appelé RAII (acquisition de ressources est d'initialisation) et aussi SBRM (champ d'application lié à la gestion des ressources). Une autre application courante est d'allouer de la mémoire, puis dans le destructeur d'espace libre de la mémoire à nouveau.

Un autre objectif est de faire plusieurs choses:

void function() {
    // set up timer A
    {
        int config = get_config(TIMER_A);
        // ... 
    } 

    // set up timer B
    {
        int config = get_config(TIMER_B);
        // ...
    } 
}

Il va garder les choses distincte de sorte qu'on peut facilement trouver les différents blocs de construction. Vous pouvez utiliser des variables ayant le même nom, comme le fait le code ci-dessus, parce qu'ils ne sont pas visibles à l'extérieur de leur champ d'application, ainsi, ils ne sont pas en conflit les uns avec les autres.

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