C语言关键字typedef详解

typedef详解

typedef和基本类型

typedef是c语言的关键字,作用是为一种数据类型定义一个新的名字,最简单的用法是用typedef为C语言基本类型取一个别名。

char a = 'H';
typedef char CHAR;
CHAR b = 'E';
printf("%c %c\n",a,b);

我们发现此时CHAR就已经替代了char这个原本的关键字。

最常见的用法就是:

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; 

在做一些嵌入式开发的过程中,我们需要自己定义bool类型,定义一些很明确的直接表示字符位数的类型。

typedef和struct

typedef也可以用来给结构体取一个新的名字。

常用的声明方式为

typedef struct student {
    
    
	int age;
	char name[20];
} Stu;

这样就把一个 struct student 类型直接简化为了 Stu 类型。

举个例子:

#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;
}

typedef和数组

在需要重复定义数组的时候

char line[81]; 
char text[81];

// 可以像下面这样定义
typedef char Line[81]; 
Line text, secondline;

typedef和指针

我们可以像下面这样隐藏指针语法

typedef char* pstr; 
pstr str = "abcdef";
int mystrcmp(pstr, pstr);

typedef和函数

函数指针一般用于回调,回调就涉及到函数指针,当我们的程序中有以下函数

void printHello(int i);

然后我们要定义一个函数指针,指向printHello,并且调用这个方法,代码如下:

void (*pFunc)(int);            // 定义函数指针
pFunc = &printHello;           // 函数指针指向printHello
(*pFunc)(110);                 // 调用printHello

大家可以看到,声明一个函数指针是比较复杂的,尤其是当你要在多处地方声明同一个类型的函数指针变量,代码更加复杂,所以有下面简化的做法:

typedef void (*PrintHelloHandle)(int);

PrintHelloHandle pFunc;
pFunc = &printHello;
(*pFunc)(110);

以后其他地方的程序需要声明类似的函数指针,只需要下面代码:

PrintHelloHandle pFuncOther;

这样代码会变得更加简介

typedef结论

typedef 行为有点像 #define 宏,用其实际类型替代同义字。但是并不是简单的替换,他会在编译时由编译器进行一些推断,所以typedef的行为有一些复杂。把这些复杂的行为拆开看,其实还是一些替换,只是为了代码简洁,typedef并不创造新的类型。

猜你喜欢

转载自blog.csdn.net/weixin_43903639/article/details/130829201