以linux/unix的signal函数为例解释函数指针与函数..
时间:2010-12-19 来源:paixian1987
首先说明函数指针的定义形式:
<存储类型> 数据类型 (* 函数指针名) (参数表);
其中存储类型一般不写,用默认形式。可以选auto型、static型和extern型等。数据类型是指针所指向函数返回值的数据类型。参数表是指向函数的参数表。
再说明一个函数的返回值是一个函数指针(可理解为此函数A实际返回的是一个指向另一个函数B的指针)的定义形式:
<存储类型> 数据类型 (* 函数名(参数表1))(参数表2);
其中存储类型是函数的存储类型,可选。如上所述。
数据类型是此函数返回的函数指针的返回值的数据类型(此处可理解另一个函数B的返回值的数据类型)。
(* )星号表示此函数A返回的是一个指针,即返回的是一个函数指针B。
函数名(参数表1),函数名是此函数A的函数名称,参数表1是函数A的参数表。
(参数表2),表示返回的函数指针(函数B)的参数表。
由上,我们可以再来看看signal的定义原型:
#include<signal.h>
void (* signal (int signo, void (*func) (int) )) (int );
由于上面所讲的,可以看出signal的定义是与一个函数的返回值是一个函数指针的定义是类似的。我们可以采用分而治之的方法来分解这个函数。
首先,可以先看看函数参数表的说明。int signo, void (*func) (int) ,即红色字的部分。从这个部分,我们可以看到,signal有两个参数,第一个是个整型的数int;第二个参数是void (*func) (int),按照上面函数指针的定义,可以知道第二个参数其实是一个函数指针。它的返回类型是void,函数指针名是func,返回参数是int。
忽略参数表,用..代替之后,可以写为:void (* signal (...)) (int );于是可以很清楚地看到这是一个返回函数指针的函数。这个函数名是signal,参数是...,返回的是一个指针,指向带有一个int型参数,返回值是void的函数。
实际,按照man手册,可以看到,signal返回的值是指向信号signo前一次有效动作的指针,因此它的原型是和func相同的,即返回void空,有一个int的参数。
相关阅读 更多 +