61 votes

Pourquoi mettre des blocs de code C entre accolades?

Je suis à la recherche à du code C, et ont remarqué qu'il est plein de ces accolades entourant les blocs de code, sans aucune sorte de structure de contrôle. Prendre un coup d'oeil, voir:

//do some stuff . . .
fprintf(stderr, "%.2f sec\n", (float)(clock() - t) / CLOCKS_PER_SEC);
{
    //a block! why not?
    char *tmp_argv[3];
    tmp_argv[0] = argv[0]; tmp_argv[1] = str; tmp_argv[2] = prefix;
    t = clock();
    fprintf(stderr, "[bwa_index] Convert nucleotide PAC to color PAC... ");
    bwa_pac2cspac(3, tmp_argv);
    fprintf(stderr, "%.2f sec\n", (float)(clock() - t) / CLOCKS_PER_SEC);
}

Pourquoi voulez-vous insérer des blocs de ce genre dans le code? Il est plein à craquer de 'em. Est-il une sorte d'avantage de performances? Certains mystiques chose C? Pourquoi???

edit: Ce code si de BWA, un bio-informatique programme qui aligne petites séquences de référence de grande taille à l'aide de la transformée de Burrows-Wheeler transformer, dans le cas où vous vous poseriez. Cet exemple de code n'est pas particulièrement pertinent à la fonctionnalité de l'application.

91voto

DigitalRoss Points 80400

Legacy code { } pour faire des déclarations à tous

En C89, vous ne pouviez pas seulement n' int i; n'importe où; les déclarations ont été uniquement valable au début de blocs.

Donc:

a = 1;
int i; /* error */
i = 2;

...n'était pas valable, mais

a = 1
if (e) {
  int i;

...était très bien, comme un simple bloc.

La résultante de style a continué même après les déclarations d'entrée en vigueur (C99) block-item(s), en partie par l'inertie, en partie pour assurer la portabilité, et aussi parce qu'il est logique d'établir une marge pour de nouvelles déclarations.

38voto

jldupont Points 31331

Pour les variables de portée. Par exemple, la variable tmp_argv ne sera valide qu'entre les accolades.

7voto

Paul Lalonde Points 3940

Un bloc est une étendue qui détermine la durée de vie des variables, ainsi que leur visibilité pour le compilateur. Ainsi, les variables créées dans un bloc disparaissent lorsque le contrôle quitte le bloc.

Cela peut être très pratique lorsque ces variables sont des instances de classes avec des constructeurs et des destructeurs.

Cependant, dans votre exemple, il n'y a pas beaucoup d'avantage.

6voto

jeffamaphone Points 31732

Cela crée une portée. Les objets empilés sont détruits lorsqu'ils disparaissent. On dirait qu’il faut taper à la machine, ce qui voudrait dire que chaque bloc est quelque chose qu’ils souhaitent chronométrer. Cependant, je ne vois aucun objet de minuterie limité, alors, oui, cela n'a aucun sens.

5voto

pgb Points 17316

Les variables que vous déclarez à l'intérieur du bloc sont locales à ce bloc. De cette façon, vous pourrez peut-être redéfinir tmp_argv à un autre endroit de votre code (ci-dessous) sans entrer en conflit avec ce morceau de code.

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