C语言进阶C语言

复杂声明 | C语言

2018-01-16  本文已影响109人  好好编程

今天看了《C专家编程》里的'分析C语言的声明'一章,终于懂了C语言的复杂声明是怎么解析的。虽然在平时写代码的时候用到复杂声明的情况几乎没有,这里还是做一个记录,也是加深对C语言声明的理解。

声明的优先级规则

以下规则来自《C专家编程》。

C语言声明的优先级规则:

通过上述规则画出一个神奇的声明解析环:


image

例子1

看一个例子:char *(*next)();

用优先级规则来解读一下:

把上述结果总结一下就是:next是一个指针,它指向一个函数,该函数的返回值是一个char类型的指针

例子2

例子const char *str[10];

如果是char * const str[10];

例子3

来一个复杂一点的例子char *(* test[10])(int p)

typedef 简化复杂声明

typedef的功能是为一个类型引入新的名字。当需要使用到复杂声明的时候,使用typedef可以简单声明。典型的例子是signal()原型的声明。signal()原型是一种系统调用,用于通知运行时系统有“软件中断”产生。

signal()的声明如下:void (*signal(int sig, void(*func)(int)))(int);。运用上面的声明解析,得到它的意思如下:
void (*signal( ))(int);,signal是一个函数,它返回一个函数指针,后者所指向的函数接受一个int参数并返回void。signal有两个参数,其中一个恐怖的参数和返回值是同一类型:void (*func)(int)

上述声明可以使用typedef来简化,让我们用typedef来表示通用部分:

/*
 * 表示ptr_to_func是一个函数指针,指向一个参数为int,返回值为void的函数。
 */
typedef void (* ptr_to_func)(int);

/*
 * 表示signal是一个函数,它接受两个参数,一个是int,一个是ptr_to_func,返回值为ptr_to_func。
 */
ptr_to_func signal(int, ptr_to_func);

参考

上一篇下一篇

猜你喜欢

热点阅读