Explicación detallada de typedef
typedefs y tipos primitivos
typedef es una palabra clave en lenguaje C , y su función es definir un nuevo nombre para un tipo de datos. El uso más simple es usar typedef para tomar un alias para el tipo básico de lenguaje C.
char a = 'H';
typedef char CHAR;
CHAR b = 'E';
printf("%c %c\n",a,b);
Descubrimos que CHAR ha reemplazado la palabra clave original de char en este momento.
El uso más común es:
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;
En el proceso de desarrollo integrado, necesitamos definir el tipo bool por nosotros mismos y definir algunos tipos que representen directamente la cantidad de caracteres.
estructura typedef
Un typedef también se puede usar para dar a una estructura un nuevo nombre.
La forma habitual de declarar es
typedef struct student {
int age;
char name[20];
} Stu;
Esto struct student
simplifica un tipo directamente a Stu
un tipo.
Por ejemplo:
#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 y arreglos
Cuando necesita definir repetidamente una matriz
char line[81];
char text[81];
// 可以像下面这样定义
typedef char Line[81];
Line text, secondline;
typedefs y punteros
Podemos ocultar la sintaxis del puntero como a continuación
typedef char* pstr;
pstr str = "abcdef";
int mystrcmp(pstr, pstr);
typedefs y funciones
Los punteros de función se usan generalmente para devoluciones de llamada, y las devoluciones de llamada involucran punteros de función.Cuando nuestro programa tiene las siguientes funciones
void printHello(int i);
Luego necesitamos definir un puntero de función, señalarlo printHello
y llamar a este método, el código es el siguiente:
void (*pFunc)(int); // 定义函数指针
pFunc = &printHello; // 函数指针指向printHello
(*pFunc)(110); // 调用printHello
Como puede ver, declarar un puntero de función es más complicado, especialmente cuando desea declarar el mismo tipo de variable de puntero de función en varios lugares, el código es más complicado, por lo que existen los siguientes métodos simplificados:
typedef void (*PrintHelloHandle)(int);
PrintHelloHandle pFunc;
pFunc = &printHello;
(*pFunc)(110);
En el futuro, los programas en otros lugares deberán declarar punteros de funciones similares y solo necesitarán el siguiente código:
PrintHelloHandle pFuncOther;
Esto hace que el código sea más conciso.
conclusión de typedef
typedef se comporta un poco como una macro #define, sustituyendo un sinónimo por su tipo real. Pero no es un reemplazo simple, será inferido por el compilador en tiempo de compilación, por lo que el comportamiento de typedef es un poco complicado. Tomando estos comportamientos complicados aparte, en realidad son algunos reemplazos, solo por la simplicidad del código, typedef no crea nuevos tipos.