49 votes

Comment lire les déclarations en C ?

J'ai entendu parler de certaines méthodes, mais aucune d'entre elles ne s'est imposée. Personnellement, j'essaie d'éviter les types complexes en C et de les décomposer en typedef de composants.

Je suis maintenant confronté à la maintenance d'un code hérité d'un soi-disant "programmeur trois étoiles", et j'ai du mal à lire certains des ***code[][].

Comment lire des déclarations C complexes ?

2 votes

Les yeux fonctionnent... Mais si vous êtes coincé sous Windows, je suppose que vous pouvez essayer Narrator.

6 votes

Alors, "programmeur trois étoiles" signifie-t-il qu'il y a au moins trois étoiles dans tous les types qu'il déclare ?

3 votes

En gros, c'est une insulte de la vieille école pour un mauvais programmeur c.

38voto

Eli Courtwright Points 53071

Cet article explique 7 règles relativement simples qui vous permettront de lire n'importe quelle déclaration C, si vous avez envie ou besoin de le faire manuellement : http://www.ericgiguere.com/articles/reading-c-declarations.html

  1. Trouvez l'identifiant. C'est votre point de départ. Sur une feuille de papier, écrivez "déclarer l'identifiant comme".

  2. Regardez à droite. S'il n'y a rien, ou s'il y a une parenthèse droite ")", passez à l'étape 4.

  3. Vous êtes maintenant positionné sur un descripteur de tableau (parenthèse gauche) ou de fonction (parenthèse gauche). Il peut y avoir une séquence de ceux-ci, se terminant soit par une parenthèse droite non appariée, soit par la fin du déclarateur (un point-virgule ou un "=" pour l'initialisation). Pour chacun de ces descripteurs, en lisant de gauche à droite :

    • si un tableau vide "[]", écrire "tableau de".
    • si c'est un tableau avec une taille, écrivez "taille du tableau de".
    • si une fonction "()", écrivez "fonction de retour".

    S'arrête à la parenthèse non appariée ou à la fin du déclarateur, selon ce qui se produit en premier.

  4. Revenez à la position de départ et regardez vers la gauche. S'il n'y a rien, ou s'il y a une parenthèse gauche "(", passez à l'étape 6.

  5. Vous êtes maintenant positionné sur un descripteur de pointeur, "*". Il peut y avoir une séquence de ceux-ci à gauche, se terminant soit par une parenthèse gauche non appariée "(", soit par le début du déclarateur. En lisant de droite à gauche, pour chaque descripteur de pointeur, écrivez "pointeur vers". Arrêtez-vous à la parenthèse non appariée ou au début du déclarateur, selon ce qui se produit en premier.

  6. À ce stade, vous avez soit une expression entre parenthèses, soit le déclarateur complet. Si vous avez une expression entre parenthèses, considérez-la comme votre nouveau point de départ et retournez à l'étape 2.

  7. Notez le spécificateur de type. Arrêtez.

Si vous êtes d'accord avec un outil, alors je soutiens la suggestion d'utiliser le programme cdecl : http://gd.tuwien.ac.at/linuxcommand.org/man_pages/cdecl1.html

27voto

sundar Points 2271

J'utilise généralement ce que l'on appelle parfois la "règle de la main droite dans le sens des aiguilles d'une montre". Elle se présente comme suit :

  • Commencez par l'identifiant.
  • Allez à la droite immédiate de celui-ci.
  • Puis déplacez-vous dans le sens des aiguilles d'une montre et venez sur le côté gauche.
  • Déplacez-vous dans le sens des aiguilles d'une montre et arrivez sur le côté droit.
  • Faites-le tant que la déclaration n'a pas été entièrement analysée.

Il y a une méta-règle supplémentaire dont il faut s'occuper :

  • S'il y a des parenthèses, complétez chaque niveau de parenthèses avant de sortir.

Ici, "aller" et "se déplacer" quelque part signifie lire le symbole à cet endroit. Les règles pour cela sont :

  • * - pointeur vers
  • () - fonction renvoyant
  • (int, int) - fonction prenant deux ints et retournant
  • int , char etc. - int , char etc.
  • [] - de
  • [10] - matrice de dix
  • etc.

Donc, par exemple, int* (*xyz[10])(int*, char) est lu comme suit :

xyz est un

matrice de dix

pointeur vers

fonction prenant un int* et un char et retournant

un int*

0 votes

@sundar : très belle référence !

2 votes

@sundar : Pouvez-vous l'étendre pour inclure les tableaux multidimensionnels et les pointeurs de fonction ? Qu'en est-il extern char *const (*goop( char *b ))( int, long ); ? (repris de ericgiguere.com/articles/lecture-c-declarations.html )

8voto

Dark Shikari Points 6178

Un seul mot : cdecl

Merde, battu de 15 secondes !

0 votes

Voir mon commentaire ci-dessus. Pour ***code[][] il renvoie syntax error :-) Un site sacrément utile, cependant

5voto

Eli Bendersky Points 82298

4voto

smink Points 39640

Cdecl (et c++decl) est un programme pour encoder et décoder les déclarations de type C (ou C++).

http://gd.tuwien.ac.at/linuxcommand.org/man_pages/cdecl1.html

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