typedef的一些高階用法

丁靖發表於2019-05-12

在原來的宣告裡逐步用別名替換一部分複雜宣告,如此迴圈,把帶變數名的部分留到最後替換,得到的就是原宣告的最簡化版。

舉例:
原宣告:void (*b[10]) (void (*)())

變數名為b,先替換右邊部分括號裡的,pFunParam為別名一:

typedef void (*pFunParam)()

再替換左邊的變數b,pFunx為別名二:

typedef void (*pFunx)(pFunParam)

原宣告的最簡化版:

pFunx b[10]

原宣告:doube(*)() (*e)[9]

變數名為e,先替換左邊部分,pFuny為別名一:

typedef double(*pFuny)()

再替換右邊的變數e,pFunParamy為別名二:

typedef pFuny (*pFunParamy)[9]

原宣告的最簡化版:

pFunParamy e

理解複雜宣告可用的“右左法則”:從變數名看起,先往右,再往左,碰到一個圓括號

就調轉閱讀的方向;括號內分析完就跳出括號,還是按先右後左的順序,如此迴圈,直

到整個宣告分析完。舉例:

int (*func)(int *p)

首先找到變數名func,外面有一對圓括號,而且左邊是一個*號,這說明func是一個指標

;然後跳出這個圓括號,先看右邊,又遇到圓括號,這說明(*func)是一個函式,所以

func是一個指向這類函式的指標,即函式指標,這類函式具有int*型別的形參,返回值

型別是int。

int (*func[5])(int *)

func右邊是一個[]運算子,說明func是具有5個元素的陣列;func的左邊有一個*,說明

func的元素是指標(注意這裡的*不是修飾func,而是修飾func[5]的,原因是[]運算子

優先順序比*高,func先跟[]結合)。跳出這個括號,看右邊,又遇到圓括號,說明func數

組的元素是函式型別的指標,它指向的函式具有int*型別的形參,返回值型別為int。

這種用法是比較複雜的,出現的頻率也不少,往往在看到這樣的用法卻不能理解,相信以上的解釋能有所幫助。

相關文章