重新定义一下复杂的代码
int (*(*pf())())() {
return nullptr;
}
这个代码很复杂,首先需要搞懂,这里到底定义了什么?函数 Or 变量
从后面的{}及返回值可以看出这是一个函数定义,且返回值为指针 (nlllptr)
函数定义三要素:1 返回值,2 函数名, 3 参数列表
返回值的类型:去掉函数名及参数列表,那么剩下的就是返回值类型了。
int (*(*pf() ) ()) () ,这是几层函数定义的嵌套呢?
小技巧:根据函数定义的三要素之3,函数名之后是要跟参数列表的,那么有几个直接配对的()对,就是几层函数的定义。这里直接配对的就是黄色标注的3对括号,所以是有3层函数定义。
解析思路:
1)、 int (*(*pf() ) ()) () ,的返回类型为int (*(*) ()) () , 我们用
typdef int (*(*T2) ()) () , 来表示函数pf的返回值类型, 那么
T2 pf() <=> int (*(*pf() ) ()) ()
2)、类型T2, typdef int (*(*T2) ()) () , 还是太复杂了,需要简化
这里T2是什么?T2是一个指向形如 * fun()的函数指针, (*T2)就是函数名。
int (*(*T2) ()) () , 去掉函数名(*T2)和参数列表(),剩下的就是返回值类型了
int (*) () 。
定义类型 typedef int (*T3) () ; // 这已经可以直接读懂了
那么
typdef int (*(*T2) ()) () <=> typedef T3 (*T2) ()
3)、结合第1、2步,
typedef int (*T3) () ;
typedef T3 (*T2) () ;
T2 pf();
4)、把第3步得到的结果还原回去
方法:把typedef中的类型名用,函数名及参数列表依次反向替换
有如下定义:
typedef int (*T3) () ;
typedef T3 (*T2) () ;
T2 pf();
问: 函数pf的最终定义是什么?
T2 pf() ,用pf()去替换 T3 (*T2) () 中的T2得到
T3 (* pf()) ();
函数 T3 (* pf()) () 的函数名和参数列表分别为 (*pf()) 和 (),用(* pf()) ()去替换
int (*T3) () 中的T3得到
int (*(* pf()) ()) (),这就是最终的定义,已经完整的还原回去了。
T2 pf() <=> T3 (* pf()) () <=> int (* (* pf()) () ) ()