最近,在学习Linux信号量时,看到signal函数中typedef的一个用法,觉得很有意思。于是就拿出来说道说道。
它定义了一个类型sighandler_t,表示指向返回值为void型(参数为int型)的函数(的)指针。它可以用来声明一个或多个函数指针。
sighandler_t sig1, sig2; 这个声明等价于下面这种晦涩难懂的写法:
void (*sig1)(int), (*sig2)(int);
1. 关于typedef
typedef作为类型定义关键字,用于在原有数据类型(基本类型、构造类型、指针等)的基础上,由用户自定义新的类型名称。typedef声明不是用于创建一个新类型,而是为某个已经存在的类型增加一个新的名字罢了。
一般,使用typedef定义另一个名称是出于可移植性的考虑。这个在嵌入式编程中使用较多。比如,某些基本数据类型在不同的处理器中的表示位数可能不同,如果要将程序移植到另一种体系结构的处理器上工作,那么势必要修改大量的代码而且容易出错。如果将它取一个新名称,然后在程序中使用新的名称来表示,那么移植的工作仅仅只是修改定义这些新名词即可。比如,只需将typedef int INT16; 替换成 typedef short INT16; 和 typedef short INT16; 替换成 typedef int INT32; 即可。
在变量定义的前面加上typedef,即可定义该变量的类型。比如, long count; 这里定义了一个长整型变量count,当加上typedef后, typedef long count; 那么count就成为了long类型。
在这里,typedef void (*sighandler_t)(int) 也可以写成void (*sighandler_t)(int),typedef 在语句中所起的作用不过就是把语句原先定义变量的功能变成了定义类型的功能而已。
2. #define和typedef
#define和typedef的作用看起来很像,不过差别缺很大。#define仅在预处理时对代码进行简单的字符串替换处理,不作正确性检查,不关含义是否正确照样替换;而typedef是在编译时处理,它建立了一个新的数据类型别名。一般来说,最好使用typedef定义用户类型,部分原因是它能正确处理指针类型。