Discussion sur les déclarations

La syntaxe et la sémantique des déclarations ne sont pas faciles à appréhender dans le langage C pour les raisons que nous allons développer. Tout d'abord, l'ordre des éléments d'une déclaration est assez peu naturel. Au lieu d'avoir comme en PASCAL, une déclaration
c : char;
qu'on peut traduire par « c est de type char », on a en C :
char c;
qu'il faut traduire par « de type char est c », ce qui est une inversion peu naturelle. Ensuite, l'identificateur qui est le nom de l'objet déclaré, au lieu d'être mis en évidence dans la déclaration, est caché au beau milieu du déclarateur. Exemple :
char **p[10];

D'autre part, le langage C fait partie des langages qui permettent au programmeur, à partir de types de base et de constructeurs de type, de construire des types complexes. Du point de vue du programmeur, il existe dans le langage les constructeurs suivants :

-
* pour les pointeurs ;
-
[ ] pour les tableaux ;
-
( ) pour les fonctions ;
-
struct pour les structures ;
-
union pour les unions.
Alors que le programmeur serait en droit de s'attendre à ce que tous ces constructeurs soient traités de manière homogène, en fait, les trois premiers sont des déclarateur alors que les deux derniers sont des spécificateur-de-type.

Autre point ajoutant encore à la confusion, le constructeur * est un constructeur préfixé alors que les constructeurs [ ] et ( ) sont postfixé, et le constructeur * a une priorité différente de celle des deux autres. Ceci à la conséquence extrêmement désagréable, qu'un type complexe écrit en C ne peut pas se lire de la gauche vers la droite, mais peut nécessiter un analyse du type de celle que l'on fait pour comprendre une expression mathématique.

Par exemple, qui pourrait dire du premier coup d'\oeil quel est le type de f dans la déclaration ci-dessous9.2 :

char (*(*f())[])()

Matthieu Moy 2017-02-08