1
votes

Cette pratique consiste-t-elle à appliquer manuellement les portées standard C?

Est-ce que créer des portées locales avec juste une paire de crochets serait-il considéré comme un C standard?

#include <stdio.h>

int main(int argc, char *argv[]) {
    {
        register char x = 'a';
        putchar(x); // works
    }
    //putchar(x); wont work
}

Ou est-il préférable de ne pas l'utiliser? Est-ce une extension de compilateur GCC?

On m'a dit une fois que la pratique acceptée est une boucle do {...} while (0); . Est-il vrai que tous les compilateurs C reconnaîtront cette pratique, tout comme il est prudent de supposer qu'un compilateur C donné reconnaîtra une instruction if ?

J'ai essayé de googler ceci, et mes résultats concernaient le comportement de l'étendue et n'avaient rien à voir avec l'application manuelle des étendues.


5 commentaires

Oui, c'est standard. Et a toujours été standard.


Beaucoup de gens considèrent que ne pas créer une portée après if ou while est une mauvaise pratique.


Oui, mais honnêtement, vous devriez vraiment avoir fait l'effort de consulter un livre en langage C avant de poser une question aussi fondamentale.


Vous ne devriez pas voir la chose do… while (0) dans le code vanille, juste dans les directives #define . C'est un kludge pour les macros. < / a>


Oui, c'est même la norme K&R. Si vous regardez même dans la première édition de "Le langage de programmation C" de Brian Kernighan et Denis Ritchie, vous constaterez qu'une paire de crochets signifie un bloc, dans lequel vous pouvez commencer à déclarer de nouveaux objets comme vous le faites au début de main () .


3 Réponses :


4
votes

Oui, c'est standard; il s'agit de la création d'une portée de bloc, telle que prise en charge par le langage C.

En ce qui concerne la partie "best to use", cela dépend, certainement cela peut être un peu déroutant pour certaines personnes.

Cela peut être très utile avec le code généré , vous n'avez donc pas à vous soucier (autant) des identifiants uniques pour les variables locales:

int main(int argc, char *argv[]) {
  {
    int x = 4;
    printf("%d\n", x);
  }
  {
    int x = 5;
    printf("%d\n", x);
  }
}


6 commentaires

"Vous ne seriez certainement pas capable de faire quelque chose comme" - que voulez-vous dire par là? Vous venez de le faire ...


@MarcoBonelli: Il veut dire, ne serait pas capable de faire ça sans les crochets.


@einpoklum hein, ça a du sens.


c'était un phrasé un peu bizarre pour être honnête


Ma question est, est-ce une extension de compilateur ou un C standard?


@ 0x10 c'est standard C



1
votes

Oui, c'est standard; vous pouvez toujours introduire une nouvelle portée avec une paire supplémentaire de {}

Je l'utilise souvent dans du code compilé conditionnellement, pour éviter les avertissements de variables inutilisées:


#if DEBUG
    {
    struct node *tmp;
    for (tmp=this; tmp; tmp= tmp->next) {
        printf(stderr, "Node %u: %s\n", tmp->num, tmp->name);
        }
     }
#endif


2 commentaires

Dans les macros, faites {"votre code"} while (0) est souvent utilisé pour forcer le point-virgule après le marco (assurez-vous que le marco se comporte comme une fonction). Je sais que cela ne fait pas partie de la question, mais j'ai pensé qu'il valait la peine de le mentionner.


Je connais la macro funky do {...} while (0) , mais cela ne faisait pas partie de la question (et ne fera que semer la confusion, à mon humble avis)



0
votes

Ceci est la norme C.

Section 6.8p1 du C standard donne la syntaxe suivante pour une instruction:

compound-statement:
   { block-item-list(opt) }

block-item-list:
  block-item
  block-item-list block-item

block-item:
  declaration
  statement

Où une instruction-composée est définie dans la section 6.8.2p1:

statement:
  labeled-statement
  compound-statement
  expression-statement
  selection-statement
  iteration-statement
  jump-statement

Ce que cela signifie, c'est que partout où une instruction peut se produire, une instruction composée (c'est-à-dire un ensemble d'instructions entourées par {} ) peut se produire.

p >


2 commentaires

Je ne comprends pas très bien le code que vous avez fourni.


Cela fait partie de la définition de la syntaxe. Vous pouvez le trouver à l'arrière de K&R, par exemple.