C代码中clever1与goo_ptr的含义及类型解析咨询
代码拆解:clever1 和 goo_ptr 的类型与含义
先把原代码贴出来:
int (*clever1(int (* (*goo_ptr)(int, int, int (*)(int, int), int(*)(int, int)))(int, int), int a, int b, int (*a_fptr)(int, int), int(*b_fptr)(int, int) ))(int, int) { return goo_ptr(a,b,b_fptr,a_fptr); }
先看 goo_ptr
类型:这是个函数指针,指向的函数要符合:
- 入参:2个
int+ 2个「接收两个int、返回int的函数指针」 - 返回值:一个「接收两个
int、返回int的函数指针」
用typedef简化写法会清晰很多,先定义一个别名:
typedef int (*BinOp)(int, int); // 代表“接收两个int、返回int”的函数指针类型那goo_ptr的类型就能写成:
BinOp (*goo_ptr)(int, int, BinOp, BinOp)- 入参:2个
含义:作为clever1的第一个参数,它指向一个“高阶函数”——这个函数能接收两个整数、两个二元运算的函数指针,最后返回另一个二元运算的函数指针。
再看 clever1
类型:这是个函数,它的特征是:
- 入参:1个上面说的goo_ptr + 2个
int+ 2个「接收两个int、返回int的函数指针」 - 返回值:一个「接收两个
int、返回int的函数指针」
用刚才的typedef简化后,clever1的声明可以写成:
BinOp clever1(BinOp (*goo_ptr)(int, int, BinOp, BinOp), int a, int b, BinOp a_fptr, BinOp b_fptr);- 入参:1个上面说的goo_ptr + 2个
含义:它就是个简单的包装函数,内部直接调用传入的goo_ptr,只是把最后两个参数(a_fptr和b_fptr)的顺序调换后传进去,然后返回goo_ptr的调用结果。
内容的提问来源于stack exchange,提问作者tianqisun
相关产品推荐
相关产品推荐

