typedef的理解及复杂函数声明的理解

来源:互联网 发布:c语言 最短字符串 编辑:程序博客网 时间:2024/04/29 10:49

在讲typedef前先简单说下#define,也许是受了这个的影响,以至于记typedef的时候总是按#define的方式来记了,先举个#define的简单例子

#define MAX_NUM 4096

对于#define还是比较好理解,就是将MAX_NUM出现的地方替换成4096,也就是简单的字符串替换。

我开始的记法就是将替换的置左边,被替换的置右边。


现在举个typedef的简单例子

typedef char INT8;

typedef是将char类型取一个别名为INT8。

我开始的记法是类型别名在右边,原类型名在左边。(与#define反一下,我都怀疑是不是就我这么想的 = =)


但当我看到如下声明时,我就束手无策了。

typedef  void (*handle)(int);

handle signal(int ,handle fun);

这种时候什么左右完全排不上用场了。




最后我换了种思考方式,就是联想到如何声明一种类型的方法,就容易理解了。(事实上在我写完这边博客后,翻阅《c专家编程》第67页有写到‘事实上,typedef的格式与变量声明完全一样,只是多了这个关键字,向你提醒它的实质。’这话时,我完全对自己无语了...)

比如 int num;它的类型是int。

那么 int (*p)(); 的类型是什么呢?

其获取方法其实跟int num;一样,就是将变量的名字和分号去掉,那么int (*p)();的类型就是 int (*)()


而typedef就是要用一个新的名字来替换原类型名,我们把上面的过程反过来想,将变量/函数名想成是我们新的类型名即可。

其实就是你先像往常声明变量或函数一样,而typedef只是将变量名换成你要设置的类型别名,比如你想用INT8这表示类型char,先像声明变量一样如下写到:

char INT8;

然后就是简单的在前面加个typedef即可。

typedef char INT8;


反过来看typedef声明好的类型,就是把typedef去掉,把它当成是变量或函数的声明,然后分析该变量或函数的类型即可。


这里说下分析的过程,

A、从左开始查看变量或函数名,然后按照优先级顺序依次读取

B、优先级从高到低依次是:

       B. 1 声明中被括号括起来的那部分

       B. 2 后缀操作符:

            括号()表示这是一个函数,而方括号表示这是一个数组

       B. 3 前缀操作符:星号*表示 "指向...的指针”。

C、如果const和volatile关键字的后面紧跟类型说明符(如int, long等),那么它作用于类型说明符。在其他情况下,const和(或)volatile关键字作用于它左边紧邻的指针星号。


比如singal函数

void (*signal(int sig, void(*func)(int)))(int);

1、先找到signal名,后面是个括号,先把括号里的东西作为一个整体,表示signal是个函数。

2、signal前面是个星号,表示函数返回一个指针。

3、 星号所在括号后面紧跟一个括号,表示指针指向带有一个int型参数并返回void的函数指针

4、signal函数参数则是一个int型及 一个指向带有一个int型参数并返回void的函数指针


这里找出共同部分就是指向带有一个int型参数并返回void的函数指针

将该共同部分定义成一个新类型, 则singal函数可声明如下:

typedef void (*handle)(int);

handle signal(int , handle);


最后说下#define宏定义,跟我一样搞不清顺序的..  就从定义这个词入手,要定义的东西先写,然后描述。



参考资料:《C专家编程》


0 0
原创粉丝点击