如何解读返回函数指针的函数声明



int (*(*pf())())() {

    return nullptr;

}

从来没有见过这样的函数声明。那么它究竟是一个怎样的函数呢?我努力回忆起《C专家编程》一书的内容,把其中解读变量声明的方法应用于该函数上,最终读懂了该函数。下面是大致的解读过程。

首先,要确定声明中出现的操作符的优先级。显然,函数调用操作符()的优先级是高于指针解引用操作符*。另外,小括号总是具有最高优先级

其次,要确定在声明中标识符与某个操作符结合起来的时候有什么意义。例如:

a()           a是一个函数
*a              a
是一个指针

由于函数声明的特殊性,当指针解引用操作符*与一个表示函数的标识符结合时,表示这个函数的返回值是一个指针。例如: *a()          表示a是一个返回值为指针的函数。

有了以上的基础,接下来我们就可以从声明中的标识符开始,按照操作符的优先级,由内向外逐步解读

pf()                                          pf是一个无参数函数

*pf()                                        pf是一个无参数函数,它的返回值是一个指针

(*pf())()                                  pf是一个无参数函数,它的返回值是一个无参数函数的指针

*(*pf())()                       pf是一个无参数函数,它的返回值是一个无参数函数的指针,这个函数的返回值又是一个指针

(*(*pf())())()                     pf是一个无参数函数,它的返回值是一个无参数函数的指针,这个函数的返回值又是一个无参数函数的指针

int (*(*pf())())()           pf是一个无参数函数,它的返回值是一个无参数函数的指针,这个函数的返回值又是一个无参数且返回值为int的函数的指针。

最终的解读结果冗长拗口。可以看出,这实际上是返回值为函数指针的函数的递归声明。下面是可读性更强的等效代码:

typedef int (*pa)();

typedef pa (*pb)();

pb pfex() { 

    return nullptr;

}

下面是验证解读结果的测试代码。不得不说,测试代码也不容易理解……

#include <iostream>

 

int a() {

    return 29;

}

 

int (*b())() {

    return a;

}

 

int (*(*pf())())() {

    return b;

}

 

typedef int (*pa)();

typedef pa (*pb)();

pb pfex() { 

    return b;

}

 

int wmain() {

 

    int r =pf()()(); 

   std::wcout << r << std::endl;

 

    r= pfex()()(); 

   std::wcout << r << std::endl; 

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值