複雜函式或變數變數定義解析的密碼
重新定義一下複雜的程式碼
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()) () ) ()