void second(fun_t first);
void second(fun_t *first);
void second(funp_t first);
针对这三种方式,在second函数内,既可以用first(14)调用也可以用(*first)(14)调用。
funp_t p; //定义一个类型是int (*)(int) 的变量p,即:函数指针p
fun_t p; //声明一个整型参数和一个整型返回值的函数p,即:int p(int);
fun_t *p; //定义一个指向函数int ()(int)的指针变量p和funp_t p;等价
funp_t setfun(funp_t nf); //right 设置一个新的函数指针nf,返回旧的函数指针
fun_t getfun();//error,函数不能返回函数
fun_t * getfun(); //right
void setfun(fun_t nf); //right 等价于 funp_t nf
void setfun(fun_t *nf); //right 等价于 funp_t nf
C99中“明确“指出函数不能返回函数(ISO/IEC 9899:1999 P141的第137号脚标注);函数内部不能定义函数;以及函数能够转换成对应的函数指针(ISO/IEC 9899:1999 P143 EXAMPLE2),反之不行!
对于fun_t作用除了结合’*’声明或定义变量外。它还有一个偶尔有用的用途:函数内部(外部)声明函数!
虽然C99指出没有static限制的函数都具有隐式的extern属性,但是某些编译器做不到:依旧是先声明(定义)再使用;因此如果某个函数在未声明或定义之前调用了,那么你必须在调用之前显式的声明!
比如下面代码片
void second(void)//first定义在后,且无前置声明
{
first(14);//某些编译器会编译不过或给出警告
}
int first(int n)
{
printf("%d\n", n);
return 7;
}
(1)可以在调用之前声明来解决
fun_t first;//函数声明
void second(void)
{
fun_t first; //函数声明
first(14);
}
//...
可以同时声明多次,但是定义只能一次。上面代码中声明两次,只是为了示例,用户自选一种即可。这里主要为了体现函数内部也可以函数声明的方式!
(2)以传递参数形式解决
void second(fun_t first)
{
first(14);
(*first)(14); //right
}
//...
typedef int (*funp_t)(int) 和typedef int fun_t(int)的比较
原文地址:http://blog.csdn.net/cwcmcw/article/details/44887359