复杂函数或变量变量定义解析的密码

重新定义一下复杂的代码

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()) () ) ()

猜你喜欢

转载自blog.csdn.net/xushibin2008/article/details/85233293
今日推荐