[C/C++]如何解读返回函数指针的函数声明
今天在看《深入理解C++11》的时候,看到一段有意思的代码:
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; }
最终的输出是两个数字29。
作者:Zplutor
出处:http://www.cnblogs.com/zplutor/
本文版权归作者和博客园共有,欢迎转载。但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南