前言
今天学习遇到了一些关于typedef
的问题,火速学习并记录。
别名替换
typedef
和宏定义#define
一样,都可以对已有内容进行替换。
但是#define
仅仅是做了字符串的替换,等于是生搬硬套换一下,在复杂表达式中没有小括号的辅助很容易翻车。
而typedef
则是为一种类型起了个别名,使用起来比#define
安全一些。
此外typedef
还能提供一种“同时声明”的功能,对简化编程很有帮助:
int *a,b;//一个是指针,一个是普通变量
int *a,*b;//两个都是指针
以上代码中,想要一句定义多个指针变量,需要在每个指针变量前加*
号。
有没有一种偷懒的方式,可以不用在指针变量前加*
号呢?
typedef int* intp;
intp a,b,c,d;
直接掏出答案,利用“同时声明”功能,可以一次对所有的指针变量赋值。
简化结构体实现
在C语言和C++中实现结构体变量的代码语句有所不同,所以该用途主要用于C语言的场合。
struct MyStruct{
int a;
int b;
};
C++中新建一个以上结构体变量的语句为:
MyStruct cppversion;
已经很简单了!但是在C语言里还需要在前面加个关键字struct
:
struct MyStruct cversion;
这样就搞得比较费事了,所以使用typedef
帮忙给代码减下肥:
typedef struct MyStruct{
int a;
int b;
}SimpleStruct;
SimpleStruct cversion;
简化复杂变量类型
考虑到C/C++中可以使用指针,因此很多时候能够定义出外表相当复杂的变量来,这样的变量不仅写起来难受,用起来更难受。
因此需要帮忙瘦个身。
以情况最多的函数指针为例:
int (*func)(int,int,int) = max;//函数指针的赋值方式,max是一个函数的名称
int process(int a,int b,int (*func)(int,int,int));//函数指针被大量用于函数参数中,用于代替传参中的各种其他函数。
这一长串让人头皮发麻,typedef
可以通过替换变量名的方式对完整的函数指针表达式进行替换!
typedef int(*Pfunc)(int,int,int);
Pfunc func= max;//函数指针的赋值方式,max是一个函数的名称,这里func就是一个函数指针
int process(int a,int b,Pfunc func);//函数指针被大量用于函数参数中,用于代替传参中的各种其他函数。这里Pfunc声明一个形参。
后记
这里转载一下关于复杂声明的解读方式:
理解复杂声明可用的“右左法则”:
从变量名看起,先往右,再往左,碰到一个圆括号就调转阅读的方向;括号内分析完就跳出括号,还是按先右后左的顺序,如此循环,直到整个声明分析完。举例:
int (*func)(int *p);
首 先找到变量名func,外面有一对圆括号,而且左边是一个*号,这说明func是一个指针;然后跳出这个圆括号,先看右边,又遇到圆括号,这说明 (*func)是一个函数,所以func是一个指向这类函数的指针,即函数指针,这类函数具有int*类型的形参,返回值类型是int。
int (*func[5])(int *);
func 右边是一个[]运算符,说明func是具有5个元素的数组;func的左边有一个*,说明func的元素是指针(注意这里的*不是修饰func,而是修饰 func[5]的,原因是[]运算符优先级比*高,func先跟[]结合)。跳出这个括号,看右边,又遇到圆括号,说明func数组的元素是函数类型的指 针,它指向的函数具有int*类型的形参,返回值类型为int。
也可以记住2个模式:
type (*)(....)函数指针
type (*)[]数组指针