C语言复杂声明-void (*signal(int sig, void (*handler)(int)))(int);

时间:2022-12-21 21:06:21

问题提出

请分析此声明:void (*signal(int sig, void (*handler)(int)))(int);

求解过程

在对上面的例子作分析之前,我们需要了解C语言的声明优先级,《C专家编程》P64原文如下:

C语言复杂声明-void (*signal(int sig, void (*handler)(int)))(int);

规则A规定了要按照优先级来解释声明(算是一句废话)。规则C请参照本人上一篇笔记:http://www.cnblogs.com/deyuanqin/p/5705967.html。规则B的具体实践过程如下图:

C语言复杂声明-void (*signal(int sig, void (*handler)(int)))(int);

本着抛砖引玉的目的,我们使用以上规则分析void (*signal(int sig, void (*handler)(int)))(int)这个复杂的声明。从易到难的顺序:

1. void (*handler)(int):

handler右边是圆括号,所以handler不是数组或者函数。再看其左边,是*(星号),所以handler是一个指向****的指针

(*handler)(int)。(*handler)的右边是圆括号,因而(*handler)(int)中的()(int)是一个返回****的函数。结合上一步分析,handler是一个指向返回****的函数的指针。

③ (*handler)(int)的右边没有符号,左边是void。综上,handler是一个指向返回void值的函数的指针

2. void (*signal(int sig, void (*handler)(int)))(int):

void (*handler)(int)在上面的步骤已经做了分析,我们可以使用语句typedef void (*handler)(int)将其简化(将handler声明为一个新的类型,这个类型是是一个指向返回void值的函数的指针。有关typedef的知识改日再做分析),则void (*signal(int sig, void (*handler)(int)))(int)就被简化为void (*signal(int sig, handle h))(int)。下面我们对void (*signal(int sig, handle h))(int)作分析:

signal右边是圆括号,因而signal()是一个返回****的函数

signal()的左边是*,因而signal()是一个返回指向****的指针的函数

 (*signal(int sig, handle h))右边是圆括号,因此(*signal(int sig, handle h))(int)是一个返回****的函数。综上,signal是一个返回指向返回****函数的指针的函数

④ (*signal(int sig, handle h))右边是void。因而,signal(这个标识符)是一个返回指向返回void值的函数的指针的函数

以上的分析过程可能有错漏,请各位看官多指教。

参考资料

1.《C专家编程》P65图3-1

2.博客http://blog.csdn.net/jiuyueguang/article/details/9350903