C语言支持一种叫做typedef的机制,它允许你为各种数据类型定义新的名字。typedef声明的写法和普通的声明基本相同,只是让typedef这个关键字出现在声明的前面。例如,下面这个声明:
char *ptr_to_char;
把变量ptr_to_char声明为一个指向字符的指针。但是,在添加了关键字typedef后,声明变为:
typedef char *ptr_to_char;
这个声明把标示符ptr_to_char作为指向字符的指针类型的新名字。你可以像使用任何预定义名字一样在声明中使用这个新名字,例如:
ptr_to_char a; //声明a是一个指向字符的指针。
使用typedef声明类型可以减少使声明变得又臭又长的危险,尤其是那些复杂的声明。而且,如果你以后觉得应该修改程序使用的一些数据的类型时,修改一个typedef声明比修改程序中与这种类型有关的所有变量(和函数)的所有声明要容易得多。
一般情况下,typedef用于简洁地表示指向其他东西的指针。典型的例子是signal()原型的声明。Signal()是一种系统调用,用于通知运行时系统,当某种特定的软件中断发生时调用特定的程序。调用signal()时,通过参数传递告诉它中断的类型以及用于处理中断的程序。在ANSI C 标准中,signal的声明如下:
void ( *signal( int sig, void( *func )( int ) ) )( int );
让我们分析一下这个函数:
void( *signal( ····· ) )( int );
signal是一个函数指针,其所指向的函数接受一个int参数并返回void。signal其中的一个参数为:
void( *func )( int )
它表示一个函数指针,所指向的函数接受一个int参数并返回void。现在,让我们看一下怎样用typedef来代表通用部分,从而简化该声明:
//ptr_to_func是一个函数指针,该函数接受一个整型参数,返回值为void
typedef void(*ptr_to_func)(int);
//signal是一个函数,它接受两个参数,其中一个是int,另一个是ptr_to_func,返回值是ptr_to_func
ptr_to_func signal( int, ptr_to_func );
typedef 和define的一些区别:
1、可以用其他类型说明符对宏类型名进行扩展,但对typedef所定义的类型名却不能这么做,如下所示:
#define peach int
Unsigned peach i ; /*没问题*/
typedef int banana;
unsigned bababa i; /*错误!*/
2、在连续几个变量的声明中,用typedef定义的类型能够保证声明中所有的变量均为同一种类型,而用#define定义的类型则无法保证,如下所示:
#define int_ptr int *
int_ptr chalk, cheese;
经过宏扩展,第二行变为 :
int * chalk, cheese;
这使得chalk和cheese成为不同的类型,chalk是一个指向int的指针,而cheese则是一个int。
typedef char * char_ptr;
char_ptr bentley, rolls_royce;
bentley和rolls_royce的类型是相同的,都是指向char的指针