typedef fou C de: quel est le point de permettre à cette syntaxe par la norme?
-
09-10-2019 - |
Question
L'ancien familier:
typedef int cute_int; //cute : common and familiar syntax.
Cette syntaxe est parfaite. Aucun problème.
Maintenant, quand nous pouvons écrire typedefs comme ci-dessus, quel est le point de permettre cette syntaxe:
int typedef crazy_int; //crazy : uncommon and unfamiliar syntax.
Juste pour les programmeurs Confuse? Est-ce la syntaxe même nécessaire partout (alors que nous avons le précédent)? Que pensez-vous du point de vue des compilateurs? Est-ce qu'ils trouvent mignon ou fou? Ou il n'a pas d'importance aux compilateurs du tout?
Par ailleurs, ce code est venu d'ici:
Dans le cas si vous vous demandez si cela est une erreur de syntaxe, puis consultez le code de travail ici à ideone.
Autres conseils
La question est "pourquoi il vous embrouille?"
La syntaxe provient de la grammaire de spécificateurs de déclaration en C ++, ce qui est très général, et utilisé pour beaucoup de choses en C ++. L'ordre de déclaration spécificateurs n'a pas d'importance. Regardez ceux-ci:
int virtual f() const, *g(int);
int ptr1, *ptr2;
int typedef const *name1, name2;
Ce sont équivalents à:
virtual int f() const;
virtual int* g(int);
int ptr1;
int *ptr2;
typedef const int* name1;
typedef const int name2;
Si vous les regardez assez, vous pouvez trouver longtemps que la syntaxe est réellement uniforme et logique. lire aussi la grammaire de C ++ peut aider.
Je ne connaissais pas cette syntaxe, bien que mon g ++ semble l'accepter ... mais d'un point de vue du compilateur, il rend les choses plus difficile l'analyse: lorsque vous rencontrez un jeton d'int
, vous ne savez pas si vous êtes parsing une définition de type (et un typedef
est sur le point d'arriver) ou vous êtes analyse d'une définition de variable / fonction ...
Le seul sens, il fait d'avoir A typedef B
est si l'on considère typedef
d'être un opérateur binaire (au sens d'une affectation de type comme A = B
).
Je ne suis pas sûr que cela est autorisé par Standart. Mais comme nous savons qu'il ya beaucoup de choses en c ++ qui a permis, mais ont une syntaxe ilogical. Par exemple ce genre de choses 1[a], "hello"[2];// ...