相似点
- 都使用typedef将由基础数据类型构成的复杂组合类型赋给一个简单的名字;
- 都遵循C的传统——由typedef定义的类型以“_t“结尾;
- 二者都能起到减少代码字符输入量的作用;
- “一定程度上”增加代码的可读性(此观点不具有绝对正确性,仁者见仁)
- 在以下情况调用函数使用方式相同:
void second(fun_t first);
void second(fun_t *first);
void second(funp_t first);
针对这三种方式,在second函数内,既可以用first(14)调用也可以用(*first)(14)调用。
区别
- typedef int (*funp_t)(int)定义一个函数指针类型 funp_t; 而typedef int (fun_t)(int)定义一个函数类型 fun_t;
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直接可用于函数参数和返回值;而fun_t可以直接用于函数参数,但是不能直接用于函数返回值,此时要结合*才可以用作返回值;
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),反之不行!
- funp_t用的较多,而fun_t用的较少!
对于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
}
//...
时间: 2024-10-27 19:22:08