typedef et noms de variables

Ignorant pourquoi je voudrais faire cela, essayant simplement de comprendre ce qui se passe ici: Ce code comstack:

#include  typedef char byte; int main (void) { byte var_byte; int byte = 10; printf("\n Test program: %d\n", byte); } 

Mais si je change l’ordre dans lequel les variables sont déclarées, cela ne comstack pas.

Cela ne comstack pas:

 #include  typedef char byte; int main (void) { int byte = 10; byte var_byte; printf("\n Test program: %d\n", byte); } 

Erreur du compilateur:

 bc:7:8: error: expected ';' before 'var_byte' byte var_byte; ^~~~~~~~ 

Quelqu’un pourrait-il s’il vous plaît expliquer pourquoi commander est important?

Dans ce programme

 #include  typedef char byte; int main (void) { int byte = 10; byte var_byte; printf("\n Test program: %d\n", byte); } 

le nom de l’ byte de la variable cache le nom du typedef.

À partir de la norme C (6.2.1 Portée des identificateurs)

  1. … Si un identifiant désigne deux entités différentes dans le même espace de noms, les étendues peuvent se chevaucher. Si tel est le cas, la scope d’une entité (la scope interne) se terminera ssortingctement avant celle de l’autre entité (la scope externe). Dans la scope interne, l’identifiant désigne l’entité déclarée dans la scope interne; l’entité déclarée dans la scope externe est masquée (et non visible) dans la scope interne.

Faites attention à ce que le nom d’un identifiant et un nom de typedef appartiennent au même espace de nom.

Le nom de typedef est déclaré dans la scope globale (scope du fichier), tandis que le nom de la variable est déclaré dans la scope du bloc interne et le nom de la variable masque le nom déclaré dans la scope globale.

Considérez ce programme.

 #include  typedef char byte; void f( void ); int main (void) { int byte = 10; printf("\n Test program: %d\n", byte); f(); } void f( void ) { byte c = 'A'; printf( "%c\n", c ); } 

Dans la scope de bloc de la fonction main (la scope interne relative à la scope du fichier), le nom du typedef est masqué par la déclaration de la variable portant le même nom.

Toutefois, à l’intérieur de la scope de bloc de la fonction f le nom déclaré dans le typedef est visible car aucune autre déclaration dans la scope de bloc de la fonction ne masque le nom déclaré dans le typedef.

Voici un programme plus intéressant qui traite du sharepoint déclaration (c’est un terme C ++)

 #include  size_t byte = 255; int main(void) { typedef int byte[byte]; { byte byte; printf( "sizeof( byte ) = %zu\n", sizeof( byte ) ); } return 0; } 

Sa sortie pourrait ressembler à

 sizeof( byte ) = 1020 

Voici dans la scope du fichier il y a une variable déclarée avec le nom byte

 size_t byte = 255; 

Dans la scope du bloc externe de la fonction main il est introduit un byte nom typedef.

 typedef int byte[byte]; 

Il masque l’ byte nom précédemment déclaré après la déclaration du déclarant. C’est dans ce typedef

  typedef int byte[byte]; 

le nom byte dans les accolades correspond au nom global byte .

Ensuite, dans la scope du bloc interne, un tableau avec le même byte nom est déclaré, qui masque le nom de typedef.

 byte byte; 

Faites attention à cela dans l’expression

 sizeof( byte ) 

il utilise le nom du tableau et non le nom typedef.

Modifier ici: (incompréhension de la question)

Lorsque vous déclarez une variable en C, les structures typedef ne sont pas recherchées pour savoir si une structure porte le même nom avec la variable. Sur le premier code,

 byte var_byte; 

cette ligne de code précède la déclaration de la variable int byte . L’ordinateur recherchera la référence la plus récente du mot octet car il s’agissait du nom de la structure.

Dans le second cas, la variable int byte ne renvoie pas d’erreur car vous pouvez toujours créer des variables avec le même nom de type de structure en C. Mais vous ne pourrez plus créer de nouvelles structures dans cette structure car l’ordinateur pensera que il fait référence au nom de la variable et non au type de structure car la variable a été déclarée le plus récemment