码迷,mamicode.com
首页 > 其他好文 > 详细

typedef int (*funp_t)(int) 和typedef int fun_t(int)的比较

时间:2015-04-05 20:33:30      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:typedef   c   c++   函数指针   调用函数   

相似点

  • 都使用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
}
//...

typedef int (*funp_t)(int) 和typedef int fun_t(int)的比较

标签:typedef   c   c++   函数指针   调用函数   

原文地址:http://blog.csdn.net/cwcmcw/article/details/44887359

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!