1. 程式人生 > >複雜函式或變數變數定義解析的密碼

複雜函式或變數變數定義解析的密碼

重新定義一下複雜的程式碼

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