Heim> häufiges Problem> Hauptteil

Was sind die Verwendungszwecke von typedef?

DDD
Freigeben: 2023-06-09 13:31:22
Original
5056 Leute haben es durchsucht

Die Verwendung von Typedef ist: 1. Typedef-Basisdatentypen verwenden „Aliase“. Alle Datentypen in der C-Sprache können Typedef verwenden, um den Typnamen neu zu definieren. 2. Typedef verwendet „Aliase“ für benutzerdefinierte Daten Typen. ", die benutzerdefinierten Datentypen umfassen: Struktur Strukturname { };, Union Unit Name { };, Enumeration Enum { }; 3. Typedef verwendet „Alias“ für Array; 4. Typedef verwendet „Alias“ für Zeiger.

Was sind die Verwendungszwecke von typedef?

Die Betriebsumgebung dieses Artikels: Windows 10-System, C++ 20-Version, Dell G3-Computer.

In praktischen Anwendungen hat Typedef hauptsächlich die folgenden vier Verwendungszwecke:# #

1) Typedef-Basisdatentypen verwenden „Aliase“
Das heißt, alle Datentypen in der C-Sprache können das Schlüsselwort typedef verwenden. Neu definieren der Typname

typedef unsigned int size;typedef unsigned int16 u16;typedef unsigned int8 u8;...
Nach dem Login kopieren
Nach dem Login kopieren
2) typedef nimmt einen „Alias“ für den benutzerdefinierten Datentyp an
Zu den benutzerdefinierten Datentypen gehören: Struktur Name der Körperstruktur { };, Union Body Unit Name { };, Enumeration Enum { }; #Sie können typedef auch verwenden, um Folgendes zu definieren: " für das Array

struct students{ char sex; char name[120]; int ages;};
Nach dem Login kopieren
Nach dem Login kopieren

# #4) typedef nimmt einen „Alias“ für den Zeiger

Gewöhnlicher Zeiger
struct students{ char sex; char name[120]; int ages;}std;std.name[20]="wujunwu"
Nach dem Login kopieren
Nach dem Login kopieren
ist äquivalent zu:
struct students{ char sex; char name[120]; int ages;};typedef struct students std;std.name[20]="wujunwu"
Nach dem Login kopieren
Nach dem Login kopieren
wenn der Datentyp von a char ist, also char a =2, dann
typedef char arr_name[20];arr_name ane; ane[20]="wujunwu"
Nach dem Login kopieren
Nach dem Login kopieren
Funktionszeiger
int a=2;int* pointer;pointer =&a;
Nach dem Login kopieren
Nach dem Login kopieren
Tatsächlich führt das obige Programm zwei Schritte aus:
Schritt eins: Geben Sie dem Zeiger einen „Alias“

int a=2;typedef int* pointer;pointer p;p=&a;
Nach dem Login kopieren
Nach dem Login kopieren
# #Schritt zwei: Erzwungene Typkonvertierung
char a=2;typedef int* pointer;pointer p;p=&(pointer)a;
Nach dem Login kopieren
Nach dem Login kopieren

Schritt drei: Weisen Sie dem Zeiger einen Wert zu# #

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;
Nach dem Login kopieren
Nach dem Login kopieren
Zusammenfassung: Bei Verwendung von typedef erstellt typedef keinen neuen Typ, sondern stellt lediglich einen „Alias“ für einen vorhandenen Typ zur Verwendung im Programm bereit.
Traps in typedef


Sehen Sie sich als Nächstes ein einfaches Beispiel für die Verwendung von typedef an, wie im folgenden Code gezeigt:

pCopySDMMC2Mem p1;pBL2Type p2;
Nach dem Login kopieren
Nach dem Login kopieren
# #Entspricht „const PCHAR“ im obigen Code „const char*“?

Die Antwort ist nein. Der Grund ist einfach. Typedef wird zum Definieren eines neuen Alias eines Typs verwendet. Es unterscheidet sich von einem Makro und ist kein einfacher String-Ersatz. Daher verleiht die Konstante in „const PCHAR“ dem gesamten Zeiger selbst Konstanz, was den Konstantenzeiger „char* const (ein konstanter Zeiger, der auf char zeigt)“ bildet. Das heißt, es entspricht tatsächlich „char* const“ und nicht „const char* (Zeiger auf Konstante char)“. Natürlich ist es auch einfach, const PCHAR äquivalent zu const char* zu machen, wie im folgenden Code gezeigt:

(pCopySDMMC2Mem)0xD0037F98; //真正在写代码时不能这样写(pBL2Type)0x23E00000;
Nach dem Login kopieren
Nach dem Login kopieren
Tatsächlich sollte jedes Mal, wenn Sie eine Typedef für einen Zeiger deklarieren, diese im sein final Typedef fügt dem Namen eine Konstante hinzu, sodass der Zeiger selbst konstant ist.

Es sollte auch beachtet werden, dass typedef zwar keinen wirklichen Einfluss auf die Speichereigenschaften des Objekts hat, aber dennoch ein Schlüsselwort der Speicherklasse in der Syntax ist, genau wie auto, extern, static und register das gleiche. Daher ist die folgende Deklarationsmethode nicht möglich:

p1=(pCopySDMMC2Mem)0xD0037F98;p2 = (pBL2Type)0x23E00000;
Nach dem Login kopieren
Nach dem Login kopieren
Der Grund dafür ist, dass mehrere Schlüsselwörter der Speicherklasse nicht deklariert werden können, da typedef bereits die Position des Schlüsselworts der Speicherklasse belegt hat. Dies ist nicht mehr möglich Verwenden Sie in einer Typedef-Deklaration das Schlüsselwort static oder ein anderes Speicherklassenschlüsselwort. Natürlich meldet der Compiler auch einen Fehler. Die Fehlermeldung in VC++2010 lautet beispielsweise „Es können nicht mehrere Speicherklassen angegeben werden.“

Der Unterschied zwischen typedef und #define:
# #(1) Der von typedef erstellte Symbolname ist auf Typen beschränkt, nicht auf Werte.

(2) typedef wird vom Compiler interpretiert, nicht vom Präprozessor

# #

typedef Die vier Verwendungen vonIn praktischen Anwendungen hat typedef hauptsächlich die folgenden vier Verwendungen:

1) Typedef Basic Der Datentyp nimmt „Alias“ an #2) typedef akzeptiert „Aliase“ für benutzerdefinierte DatentypenHäufig verwendete Methoden zum Neudefinieren von Datennamen für Strukturen sind:
typedef unsigned int size;typedef unsigned int16 u16;typedef unsigned int8 u8;...
Nach dem Login kopieren
Nach dem Login kopieren
Sie können typedef auch verwenden, um Folgendes zu definieren:

struct students{ char sex; char name[120]; int ages;};
Nach dem Login kopieren
Nach dem Login kopieren
# #3 ) typedef benötigt einen „Alias“ für das Array
struct students{ char sex; char name[120]; int ages;}std;std.name[20]="wujunwu"
Nach dem Login kopieren
Nach dem Login kopieren

4) typedef benötigt einen „Alias“ für den Zeiger

# #Gewöhnlicher Zeiger

struct students{ char sex; char name[120]; int ages;};typedef struct students std;std.name[20]="wujunwu"
Nach dem Login kopieren
Nach dem Login kopieren
ist äquivalent zu:
typedef char arr_name[20];arr_name ane; ane[20]="wujunwu"
Nach dem Login kopieren
Nach dem Login kopieren
Wenn der Datentyp von a char ist, also char a =2; dann # #
int a=2;int* pointer;pointer =&a;
Nach dem Login kopieren
Nach dem Login kopieren
Funktionszeiger
int a=2;typedef int* pointer;pointer p;p=&a;
Nach dem Login kopieren
Nach dem Login kopieren
Tatsächlich führt das obige Programm zwei Schritte aus:
Der erste Schritt: Geben Sie dem Zeiger einen „Alias“
char a=2;typedef int* pointer;pointer p;p=&(pointer)a;
Nach dem Login kopieren
Nach dem Login kopieren
Schritt 2: Erzwungene Typkonvertierung
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;
Nach dem Login kopieren
Nach dem Login kopieren
Schritt 3: Weisen Sie dem Zeiger einen Wert zu

pCopySDMMC2Mem p1;pBL2Type p2;
Nach dem Login kopieren
Nach dem Login kopieren
Zusammenfassung: Bei Verwendung von typedef ist dies bei typedef der Fall Es wird kein neuer Typ erstellt, sondern nur ein neuer Typ für einen bestimmten Typ. Stellt einen „Alias“ für einen vorhandenen Typ zur Verwendung in einem Programm bereit.

Traps in typedef
Sehen Sie sich als Nächstes ein einfaches Typedef-Verwendungsbeispiel an, wie im folgenden Code gezeigt:

(pCopySDMMC2Mem)0xD0037F98; //真正在写代码时不能这样写(pBL2Type)0x23E00000;
Nach dem Login kopieren
Nach dem Login kopieren
# #Entspricht „const PCHAR“ im obigen Code „const char*“?
Die Antwort ist nein. Der Grund ist einfach. Typedef wird zum Definieren eines neuen Alias eines Typs verwendet. Es unterscheidet sich von einem Makro und ist kein einfacher String-Ersatz. Daher verleiht die Konstante in „const PCHAR“ dem gesamten Zeiger selbst Konstanz, was den Konstantenzeiger „char* const (ein konstanter Zeiger, der auf char zeigt)“ bildet. Das heißt, es entspricht tatsächlich „char* const“ und nicht „const char* (Zeiger auf Konstante char)“. Natürlich ist es auch einfach, const PCHAR äquivalent zu const char* zu machen, wie im folgenden Code gezeigt:

p1=(pCopySDMMC2Mem)0xD0037F98;p2 = (pBL2Type)0x23E00000;
Nach dem Login kopieren
Nach dem Login kopieren
Tatsächlich sollte jedes Mal, wenn Sie eine Typedef für einen Zeiger deklarieren, diese im sein final Typedef fügt dem Namen eine Konstante hinzu, sodass der Zeiger selbst konstant ist.

Es sollte auch beachtet werden, dass typedef zwar keinen wirklichen Einfluss auf die Speichereigenschaften des Objekts hat, aber dennoch ein Schlüsselwort der Speicherklasse in der Syntax ist, genau wie auto, extern, static und register das gleiche. Daher ist die folgende Deklarationsmethode nicht möglich:

typedef char* PCHAR;int strcmp(const PCHAR,const PCHAR);
Nach dem Login kopieren
Der Grund dafür ist, dass mehrere Schlüsselwörter der Speicherklasse nicht deklariert werden können, da typedef bereits die Position des Schlüsselworts der Speicherklasse belegt hat. Sie können dies nicht mehr tun Verwenden Sie in einer Typedef-Deklaration das Schlüsselwort static oder ein anderes Speicherklassenschlüsselwort. Natürlich meldet der Compiler auch einen Fehler. Die Fehlermeldung in VC++2010 lautet beispielsweise „Es können nicht mehrere Speicherklassen angegeben werden.“

Das obige ist der detaillierte Inhalt vonWas sind die Verwendungszwecke von typedef?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!