各位看官们,大家好,上一回中咱们说的是数组大小的例子,这一回咱们说的例子是:浅谈typedef。闲话休提,言归正转。让我们一起talk C栗子吧!
最近有看官问一些关于typedfe的问题,我在这里专门做一个说明,希望对大家有帮助。
typedef是C语言的一个关键字,用来重新定义类型。通俗点说叫起别名或者起绰号也可以。
typedef通常有两个功能:
- 为了程序简洁易懂(可读性好);
- 为了避免程序出错;
简洁易懂
关于简洁易懂,我们举一个例子:
typedef struct person
{
int age;
char *name;
char flag;
}Person;
在例子中定义了一个新的类型:Person.它和struct person的效果相同,在下面的代码中
Person p1; //定义一个结构体变量
struct person p1; //定义一个结构体变量
在上面的例子中Person p1; 等价于 struct person p1.但是前面的写法更加简洁一些。
还记得是我们在前面的章回中介绍过后的函数;signal吗?下面是signal函数的原型:
void (*signal(int signo, void (*func) (int))) (int)
我们可以定义一个新类型:
typedef void func (int);
它表示一个函数,该函数拥有一个int类型的参数,并且返回类型为void。定义好该类型后,函数signal的函数原型可以这样写:
func * signal (int signo, func *pFun); //使用typedef定义新类型后的signal函数
现在的signal函数是不是简洁很多呢。
避免出错
关于避免程序出错,我们也举一个例子:
#include <stdio.h>
int main()
{
int *p1,p2;
int a,b;
a = 3;
b = 5;
p1 = &a;
p2 = &b;
printf("a = %d \n",*p1);
printf("b = %d \n",*p2);
return 0;
}
编译上面的程序会有编译警告和错误出现:
In function ‘main’:
typFile.c:12:5:
warning: assignment makes integer from pointer without a cast [enabled by default]
p2 = &b; //发出警告
typFile.c:15:21: error: invalid type argument of unary ‘*’ (have ‘int’)
printf("b = %d \n",*p2); //编译错误
其实我们是想定义两个int类型的指针,结果定义了一个指针,一个变量,为了避免这种错误,我们可以在程序中使用typedef来定义一个指针类型。具体如下:
#include <stdio.h>
typedef int * pInt; //定义一个新的指针类型
int main()
{
pInt p1,p2; //使用新类型定义两个指针
int a,b;
a = 3;
b = 5;
p1 = &a;
p2 = &b;
printf("a = %d \n",*p1);
printf("b = %d \n",*p2);
return 0;
}
编译该程序,刚才的警告和错误没有了,我们运行编译后的程序可以得到以下结果:
a = 3
b = 5 //程序运行正确
各位看官,关于浅谈typedef的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。