Detaillierte Erläuterung der Typdefinition
Typedefs und primitive Typen
typedef ist ein Schlüsselwort in der C-Sprache und dient dazu, einen neuen Namen für einen Datentyp zu definieren. Die einfachste Verwendung besteht darin, typedef zu verwenden, um einen Alias für den Basistyp der C-Sprache zu verwenden.
char a = 'H';
typedef char CHAR;
CHAR b = 'E';
printf("%c %c\n",a,b);
Wir haben festgestellt, dass CHAR zu diesem Zeitpunkt das ursprüngliche Schlüsselwort char ersetzt hat.
Die häufigste Verwendung ist:
typedef enum {
true=1, false=0 } bool;
typedef signed char int8_t;
typedef signed short int int16_t;
typedef signed int int32_t;
typedef signed long long int int64_t;
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;
typedef unsigned long long int uint64_t;
Während einiger eingebetteter Entwicklungen müssen wir den Bool-Typ selbst definieren und einige Typen definieren, die die Anzahl der Zeichen direkt darstellen.
Typdefinition
Ein Typedef kann auch verwendet werden, um einer Struktur einen neuen Namen zu geben.
Die übliche Art der Erklärung ist
typedef struct student {
int age;
char name[20];
} Stu;
Dies struct student
vereinfacht einen Typ direkt zu Stu
einem Typ.
Zum Beispiel:
#include <stdio.h>
#include <malloc.h>
typedef struct stack {
int eax;
int ebx;
int ecx;
int edx;
} STACK;
int main() {
printf("%d \n", sizeof(STACK));
printf("%d \n", sizeof(struct stack));
STACK *p1 = (STACK *) malloc(sizeof(STACK));
struct stack *p2 = (struct stack *) malloc(sizeof(struct stack));
p1->eax = 1;
p1->ebx = 1;
p1->ecx = 1;
p1->edx = 1;
return 0;
}
Typedefs und Arrays
Wenn Sie ein Array wiederholt definieren müssen
char line[81];
char text[81];
// 可以像下面这样定义
typedef char Line[81];
Line text, secondline;
Typedefs und Zeiger
Wir können die Zeigersyntax wie folgt ausblenden
typedef char* pstr;
pstr str = "abcdef";
int mystrcmp(pstr, pstr);
Typdefinitionen und Funktionen
Funktionszeiger werden im Allgemeinen für Rückrufe verwendet, und Rückrufe beinhalten Funktionszeiger. Wenn unser Programm über die folgenden Funktionen verfügt
void printHello(int i);
Dann müssen wir einen Funktionszeiger definieren, darauf zeigen printHello
und diese Methode aufrufen. Der Code lautet wie folgt:
void (*pFunc)(int); // 定义函数指针
pFunc = &printHello; // 函数指针指向printHello
(*pFunc)(110); // 调用printHello
Wie Sie sehen, ist die Deklaration eines Funktionszeigers komplizierter, insbesondere wenn Sie dieselbe Art von Funktionszeigervariable an mehreren Stellen deklarieren möchten. Der Code ist komplizierter, daher gibt es die folgenden vereinfachten Methoden:
typedef void (*PrintHelloHandle)(int);
PrintHelloHandle pFunc;
pFunc = &printHello;
(*pFunc)(110);
Zukünftig müssen Programme an anderen Stellen ähnliche Funktionszeiger deklarieren und benötigen lediglich den folgenden Code:
PrintHelloHandle pFuncOther;
Dadurch wird der Code prägnanter
typedef-Schlussfolgerung
typedef verhält sich ein wenig wie ein #define-Makro und ersetzt seinen tatsächlichen Typ durch ein Synonym. Dies ist jedoch kein einfacher Ersatz. Er wird vom Compiler zur Kompilierungszeit abgeleitet, sodass das Verhalten von typedef etwas kompliziert ist. Wenn man diese komplizierten Verhaltensweisen auseinandernimmt, handelt es sich tatsächlich um einige Ersetzungen. Nur der Einfachheit halber erstellt typedef keine neuen Typen.