Dans cette déclaration
rofl * rofl = malloc(sizeof(rofl)); // Is the final rofl here the TYPE?
le nom de la variable rofl
cache le nom du typedef rofl
. Ainsi, dans l'opérateur sizeof, on utilise le pointeur rofl
c'est-à-dire que l'expression a le type int *
.
La même chose est valable pour cette déclaration
rofl * rofl = malloc(sizeof *rofl);
sauf que l'on utilise une expression avec le pointeur déréférencé rofl
qui a le type du nom typedef rofl
c'est-à-dire le type int
.
Il semble que la confusion soit due à cette définition de la grammaire C.
sizeof unary-expression
sizeof ( type-name )
Cependant unary-expression
peut être une expression primaire, c'est-à-dire une expression entre parenthèses.
Extrait de la norme C (6.5.1 Expressions primaires)
primary-expression:
( expression )
//...
Ainsi, par exemple, si x
est le nom d'une variable, vous pouvez alors écrire soit
sizeof x
o
sizeof( x )
Pour plus de clarté, vous pourriez insérer des blancs entre l'opérateur sizeof et l'expression primaire
sizeof ( x )
operator primary expression
À titre de comparaison, considérons un autre opérateur unaire : le plus unaire. Vous pouvez écrire par exemple
+ x
o
+ ( x )
Maintenant, il suffit de remplacer le plus unaire par un autre opérateur unaire. sizeof
.
En ce qui concerne la dissimulation des noms, le problème est résolu pour les structures, les unions et les énumérations car leurs noms incluent des mots-clés pour les balises.
Par exemple
typedef struct rofl { int x; } rofl;
void test(void) {
rofl * rofl = malloc(sizeof( struct rofl));
}
Dans cette fonction, avec l'opérateur sizeof, on utilise un nom de type struct rofl
.
Dans cette fonction
typedef struct rofl { int x; } rofl;
void test(void) {
rofl * rofl = malloc(sizeof( rofl));
}
avec l'opérateur sizeof, on utilise une expression primaire avec la variable rofl
qui a le type struct rofl *
.