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

相似点

  • 都使用typedef将由基础数据类型构成的复杂组合类型赋给一个简单的名字;
  • 都遵循C的传统——由typedef定义的类型以“_t“结尾;
  • 二者都能起到减少代码字符输入量的作用;
  • “一定程度上”增加代码的可读性(此观点不具有绝对正确性,仁者见仁)
  • 在以下情况调用函数使用方式相同:
void second(fun_t first);
void second(fun_t *first);
void second(funp_t first);
  • 1
  • 2
  • 3

针对这三种方式,在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;等价
  • 1
  • 2
  • 3
  • 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
  • 1
  • 2
  • 3
  • 4
  • 5

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

(1)可以在调用之前声明来解决

fun_t first;//函数声明
void second(void)
{
    fun_t first; //函数声明
    first(14);
}
//...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

可以同时声明多次,但是定义只能一次。上面代码中声明两次,只是为了示例,用户自选一种即可。这里主要为了体现函数内部也可以函数声明的方式! 
(2)以传递参数形式解决

void second(fun_t first)
{
    first(14);
    (*first)(14); //right
}
//...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
阅读更多
个人分类: C/C++ 剑指offer
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭