Maison > Problème commun > Quelles sont les utilisations de typedef

Quelles sont les utilisations de typedef

DDD
Libérer: 2023-06-09 13:31:22
original
5194 Les gens l'ont consulté

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 ;

Quelles sont les utilisations de typedef

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 :

1) Les types de données de base Typedef prennent des "alias"

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;...
Copier après la connexion
Copier après la connexion
2) typedef prend un "alias" pour le type de données personnalisé

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;};
Copier après la connexion
Copier après la connexion

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"
Copier après la connexion
Copier après la connexion

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"
Copier après la connexion
Copier après la connexion
3) Typedef prend un "alias" pour le tableau
typedef char arr_name[20];arr_name ane; ane[20]="wujunwu"
Copier après la connexion
Copier après la connexion
4) typedef prend un "alias" pour un pointeur
pointeur ordinaire
int a=2;int* pointer;pointer =&a;
Copier après la connexion
Copier après la connexion

est équivalent à :

int a=2;typedef int* pointer;pointer p;p=&a;
Copier après la connexion
Copier après la connexion

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;
Copier après la connexion
Copier après la connexion
;
fonction pointeur
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;
Copier après la connexion
Copier après la connexion

En fait, le programme ci-dessus effectue deux étapes :
La première étape : donner un "alias" au pointeur

pCopySDMMC2Mem p1;pBL2Type p2;
Copier après la connexion
Copier après la connexion

La deuxième étape : conversion de type forcée

(pCopySDMMC2Mem)0xD0037F98;  //真正在写代码时不能这样写(pBL2Type)0x23E00000;
Copier après la connexion
Copier après la connexion

La troisième étape : attribuer une valeur vers le pointeur

p1=(pCopySDMMC2Mem)0xD0037F98;p2 = (pBL2Type)0x23E00000;
Copier après la connexion
Copier après la connexion

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.

Traps in typedef

Regardons un exemple simple d'utilisation de typedef, comme indiqué dans le code suivant :

typedef char* PCHAR;int strcmp(const PCHAR,const PCHAR);
Copier après la connexion
Copier après la connexion

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);
Copier après la connexion
Copier après la connexion

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;
Copier après la connexion
Copier après la connexion

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 ».

La différence entre typedef et #define :

(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

Quatre utilisations de typedef

Dans les applications pratiques, typedef a principalement les quatre utilisations suivantes :

1) Le type de données de base de typedef est "aliasé"

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;...
Copier après la connexion
Copier après la connexion
2) typedef prend un "alias" pour le type de données personnalisé

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;};
Copier après la connexion
Copier après la connexion

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"
Copier après la connexion
Copier après la connexion

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"
Copier après la connexion
Copier après la connexion
3) Typedef prend un "alias" pour le tableau
typedef char arr_name[20];arr_name ane; ane[20]="wujunwu"
Copier après la connexion
Copier après la connexion
4) typedef prend un "alias" pour un pointeur
pointeur ordinaire
int a=2;int* pointer;pointer =&a;
Copier après la connexion
Copier après la connexion

est équivalent à :

int a=2;typedef int* pointer;pointer p;p=&a;
Copier après la connexion
Copier après la connexion

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;
Copier après la connexion
Copier après la connexion
function pointer
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;
Copier après la connexion
Copier après la connexion

En fait, le programme ci-dessus effectue deux étapes :
Étape 1 : donner un "alias" au pointeur

pCopySDMMC2Mem p1;pBL2Type p2;
Copier après la connexion
Copier après la connexion

Étape 2 : forcer la conversion de type

(pCopySDMMC2Mem)0xD0037F98;  //真正在写代码时不能这样写(pBL2Type)0x23E00000;
Copier après la connexion
Copier après la connexion

Étape 3 : attribuer une valeur vers le pointeur

p1=(pCopySDMMC2Mem)0xD0037F98;p2 = (pBL2Type)0x23E00000;
Copier après la connexion
Copier après la connexion

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.

Traps in typedef

Regardons un exemple simple d'utilisation de typedef, comme indiqué dans le code suivant :

typedef char* PCHAR;int strcmp(const PCHAR,const PCHAR);
Copier après la connexion
Copier après la connexion

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);
Copier après la connexion
Copier après la connexion

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;
Copier après la connexion
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal