Maison >Problème commun >Quelles sont les utilisations de typedef
L'utilisation de Typedef comprend : 1. Les types de données de base Typedef prennent des "alias", et tous les types de données en langage C peuvent utiliser typedef pour redéfinir les noms de types ; 2. Typedef prend des "alias" pour les types de données personnalisés, et les types de données personnalisés incluent : structure struct name{ };, union unit name { };, enumeration enum { }; 3. Typedef prend des "alias" pour les tableaux 4. Typedef prend des "alias" pour les pointeurs ;
L'environnement d'exploitation de cet article : système Windows 10, version C++ 20, ordinateur Dell g3.
Dans les applications pratiques, typedef a principalement les quatre utilisations suivantes :
En d'autres termes, tous les types de données en langage C sont Vous pouvez utilisez le mot-clé typedef pour redéfinir le nom du type
typedef unsigned int size;typedef unsigned int16 u16;typedef unsigned int8 u8;...
Les types de données personnalisés incluent : le nom de la structure { } ; le nom de l'unité d'union { } ;, l'énumération de l'énumération { };
struct students{ char sex; char name[120]; int ages;};
Les méthodes couramment utilisées pour redéfinir les noms de données pour les structures sont :
struct students{ char sex; char name[120]; int ages;}std;std.name[20]="wujunwu"
De plus, vous pouvez également utiliser typedef pour définir :
struct students{ char sex; char name[120]; int ages;};typedef struct students std;std.name[20]="wujunwu"
typedef char arr_name[20];arr_name ane; ane[20]="wujunwu"
int a=2;int* pointer;pointer =&a;
est équivalent à :
int a=2;typedef int* pointer;pointer p;p=&a;
Si le type de données de a est char, c'est-à-dire char a =2 alors,
char a=2;typedef int* pointer;pointer p;p=&(pointer)a;;
typedef unsigned int bool;typedef bool(*pCopySDMMC2Mem)(int, unsigned int, unsigned short, unsigned int*, bool);typedef void (*pBL2Type)(void);pCopySDMMC2Mem p1=(pCopySDMMC2Mem)0xD0037F98;pBL2Type p2 = (pBL2Type)0x23E00000;
En fait, le programme ci-dessus effectue deux étapes :
La première étape : donner un "alias" au pointeur
pCopySDMMC2Mem p1;pBL2Type p2;
La deuxième étape : conversion de type forcée
(pCopySDMMC2Mem)0xD0037F98; //真正在写代码时不能这样写(pBL2Type)0x23E00000;
La troisième étape : attribuer une valeur vers le pointeur
p1=(pCopySDMMC2Mem)0xD0037F98;p2 = (pBL2Type)0x23E00000;
Résumé : lors de l'utilisation de typedef, typedef ne crée aucun nouveau type, il fournit simplement un "alias" pour un type existant à utiliser dans le programme.
Regardons un exemple simple d'utilisation de typedef, comme indiqué dans le code suivant :
typedef char* PCHAR;int strcmp(const PCHAR,const PCHAR);
Dans le code ci-dessus, "const PCHAR" est-il équivalent à "const char*" ?
La réponse est non. La raison est très simple. Typedef est utilisé pour définir un nouvel alias d'un type. Il est différent d'une macro et n'est pas un simple remplacement de chaîne. Par conséquent, le const dans "const PCHAR" donne à l'ensemble du pointeur lui-même une constance, qui forme le pointeur constant "char* const (un pointeur constant pointant vers char)". Autrement dit, il équivaut en fait à "char* const", et non à "const char* (pointeur vers un caractère constant)". Bien sûr, il est également facile de rendre const PCHAR équivalent à const char*, comme le montre le code suivant :
typedef const char* PCHAR;int strcmp(PCHAR, PCHAR);
En fait, chaque fois que vous déclarez un typedef pour un pointeur, vous devez ajouter un const au nom de typedef final, de sorte que le pointeur lui-même soit constant.
Il est également important de noter que bien que typedef n'affecte pas vraiment les caractéristiques de stockage de l'objet, il s'agit toujours d'un mot-clé de classe de stockage dans la syntaxe, tout comme des mots-clés tels que auto, extern, static et register. Par conséquent, la méthode de déclaration suivante n'est pas réalisable :
typedef static int INT_STATIC;
La raison pour laquelle elle n'est pas réalisable est que plusieurs mots-clés de classe de stockage ne peuvent pas être déclarés. Puisque typedef a déjà occupé la position du mot-clé de classe de stockage, il n'est pas nécessaire de le déclarer. dans la déclaration typedef Vous ne pouvez plus utiliser static ou tout autre mot-clé de classe de stockage. Bien entendu, le compilateur signalera également une erreur. Par exemple, le message d'erreur dans VC++2010 est « Impossible de spécifier plusieurs classes de stockage ».
(1) Le nom du symbole créé par typedef est uniquement limité au type, pas à la valeur
(2) typedef est interprété par le compilateur, pas le préprocesseur
Dans les applications pratiques, typedef a principalement les quatre utilisations suivantes :
En d'autres termes, tous les types de données dans Le langage C peut être utilisé. Utilisez le mot-clé typedef pour redéfinir le nom du type
typedef unsigned int size;typedef unsigned int16 u16;typedef unsigned int8 u8;...
Les types de données personnalisés incluent : le nom de la structure { } et le nom de l'unité d'union { ; }; , enumeration enum { };
struct students{ char sex; char name[120]; int ages;};
Les méthodes couramment utilisées pour redéfinir les noms de données pour les structures sont :
struct students{ char sex; char name[120]; int ages;}std;std.name[20]="wujunwu"
De plus, vous pouvez également utiliser typedef pour définir :
struct students{ char sex; char name[120]; int ages;};typedef struct students std;std.name[20]="wujunwu"
typedef char arr_name[20];arr_name ane; ane[20]="wujunwu"
int a=2;int* pointer;pointer =&a;
est équivalent à :
int a=2;typedef int* pointer;pointer p;p=&a;
Si le type de données de a est char, c'est-à-dire char a =2 ; puis,
char a=2;typedef int* pointer;pointer p;p=&(pointer)a;
typedef unsigned int bool;typedef bool(*pCopySDMMC2Mem)(int, unsigned int, unsigned short, unsigned int*, bool);typedef void (*pBL2Type)(void);pCopySDMMC2Mem p1=(pCopySDMMC2Mem)0xD0037F98;pBL2Type p2 = (pBL2Type)0x23E00000;
En fait, le programme ci-dessus effectue deux étapes :
Étape 1 : donner un "alias" au pointeur
pCopySDMMC2Mem p1;pBL2Type p2;
Étape 2 : forcer la conversion de type
(pCopySDMMC2Mem)0xD0037F98; //真正在写代码时不能这样写(pBL2Type)0x23E00000;
Étape 3 : attribuer une valeur vers le pointeur
p1=(pCopySDMMC2Mem)0xD0037F98;p2 = (pBL2Type)0x23E00000;
Résumé : lors de l'utilisation de typedef, typedef Il ne crée aucun nouveau type, il fournit simplement un "alias" pour un type existant à utiliser dans le programme.
Regardons un exemple simple d'utilisation de typedef, comme indiqué dans le code suivant :
typedef char* PCHAR;int strcmp(const PCHAR,const PCHAR);
Dans le code ci-dessus, "const PCHAR" est-il équivalent à "const char*" ?
La réponse est non. La raison est très simple. Typedef est utilisé pour définir un nouvel alias d'un type. Il est différent d'une macro et n'est pas un simple remplacement de chaîne. Par conséquent, le const dans "const PCHAR" donne à l'ensemble du pointeur lui-même une constance, qui forme le pointeur constant "char* const (un pointeur constant pointant vers char)". Autrement dit, il équivaut en fait à "char* const", et non à "const char* (pointeur vers un caractère constant)". Bien sûr, il est également facile de rendre const PCHAR équivalent à const char*, comme le montre le code suivant :
typedef const char* PCHAR;int strcmp(PCHAR, PCHAR);
En fait, chaque fois que vous déclarez un typedef pour un pointeur, vous devez ajouter un const au nom de typedef final, de sorte que le pointeur lui-même soit constant.
Il est également important de noter que bien que typedef n'affecte pas vraiment les caractéristiques de stockage de l'objet, il s'agit toujours d'un mot-clé de classe de stockage dans la syntaxe, tout comme des mots-clés tels que auto, extern, static et register. Par conséquent, la méthode de déclaration suivante n'est pas réalisable :
typedef static int INT_STATIC;
La raison pour laquelle elle n'est pas réalisable est que plusieurs mots-clés de classe de stockage ne peuvent pas être déclarés. Puisque typedef a déjà occupé la position du mot-clé de classe de stockage, il n'est pas nécessaire de le déclarer. dans la déclaration typedef Vous ne pouvez plus utiliser static ou tout autre mot-clé de classe de stockage. Bien entendu, le compilateur signalera également une erreur. Par exemple, le message d'erreur dans VC++2010 est « Impossible de spécifier plusieurs classes de stockage ».
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!