[C/C++]如何解读返回函数指针的函数声明
来源:互联网 发布:最优化理论的求解软件 编辑:程序博客网 时间:2024/05/29 09:32
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; }
0 0
- [C/C++]如何解读返回函数指针的函数声明
- [C/C++]如何解读返回函数指针的函数声明
- 如何解读返回函数指针的函数声明
- 如何解读返回函数指针的函数声明
- [c/c++]如何声明函数指针数组
- C:返回值为指针的函数解读
- 如何解决C/C++返函数指针的函数声明
- C:函数指针解读
- C:函数指针解读
- 解读C的声明,解析各种函数、指针组合的声明
- C返回指针的函数
- c函数返回指针
- C函数返回指针
- c函数返回指针
- c函数返回指针
- C 返回函数指针的函数
- C语言:返回指针的函数,函数声明、定义和调用,嵌套调用
- 巧解如何声明函数指针以及函数返回值是函数指针的函数指针
- Android进阶(十九)AndroidAPP开发问题汇总(三)
- C#压缩图片时保留原始的Exif信息
- 即时通信工具中同步离线会话消息的方法及装置
- 执行pod install/update命令后停留不动
- ubuntu 终端命令大全
- [C/C++]如何解读返回函数指针的函数声明
- Social Networking Overview
- JavaScript如何处理可变参数
- 初学android的第一个习作
- json在线解析工具
- Ubuntu14.04 LTS下安装pdf2htmlEX
- 使用linux内存HugePages优化oracle内存区
- 01背包问题
- PHP使用存储过程