再论typedef
- C语言的2种类型:内建类型与用户自定义类型
- typedef定义(或者叫重命名)类型而不是变量
- 类型是一个数据模板,变量是一个实在的数据。类型是不占内存的,而变量是占内存的。
- 面向对象的语言中:类型就是类class,变量就是对象。
- typedef与#define宏的区别
- typedef char *pChar;
- #define pChar char *
- typedef与结构体
- 结构体在使用时都是先定义结构体类型,再用结构体类型去定义变量。
- C语言语法规定,结构体类型使用时必须是struct 结构体类型名 结构体变量名;这样的方式来定义变量。
// 定义了一个结构体类型,这个类型有2个名字:第一个名字是struct student,第二个类型名叫student_t
typedef struct student
{
char name[20];
int age;
}student_t;
struct student s1; // struct student是类型;s1是变量
s1.age = 12;
student_t s2;
// 第一个类型名:struct student,第二个类型名是student
typedef struct student
{
char name[20];
int age;
}student;
struct student s1;
s1.age = 12;
student s2;
// 我们一次定义了2个类型:
// 第一个是结构体类型,有2个名字:struct teacher,teacher
// 第二个是结构体指针类型,有2个名字:struct teacher *, pTeacher
typedef struct teacher
{
char name[20];
int age;
int mager;
}teacher, *pTeacher;
- 使用typedef一次定义2个类型,分别是结构体变量类型,和结构体变量指针类型。
typedef与const
- typedef int *PINT;
- const PINT p2; 相当于是int *const p2;
- const int *p和int *const p是不同的。前者是p指向的变量是const,后者是p本身const
- typedef int *PINT;
- PINT const p2; 相当于是int *const p2;
- 如果确实想得到const int *p;这种效果,
- 只能typedef const int * CPINT; CPINT p1;
使用typedef的重要意义(2个:简化类型、创造平台无关类型)
- 简化类型的描述。
- char *(*)(char *, char *);
- typedef char *(*pFunc)(char *, char *);
- 很多编程体系下,人们倾向于不使用int、double等C语言内建类型,因为这些类型本身和平台是相关的(譬如int在16位机器上是16位的,在32位机器上就是32位的)。
- 为了解决这个问题,很多程序使用自定义的中间类型来做缓冲。譬如linux内核中大量使用了这种技术.
- 内核中先定义:
- typedef int size_t;
- 然后在特定的编码需要下用size_t来替代int(譬如可能还有typedef int len_t)
- STM32的库中全部使用了自定义类型
- 譬如typedef volatile unsigned int vu32;