typedef的一些高級用法

在原來的聲明裏逐步用別名替換一部分複雜聲明,如此循環,把帶變量名的部分留到最後替換,獲得的就是原聲明的最簡化版。數組

舉例:
原聲明:void (*b[10]) (void (*)())函數

變量名爲b,先替換右邊部分括號裏的,pFunParam爲別名一:指針

typedef void (*pFunParam)()code

再替換左邊的變量b,pFunx爲別名二:變量

typedef void (*pFunx)(pFunParam)循環

原聲明的最簡化版:co

pFunx b[10]閱讀

原聲明:doube(*)() (*e)[9]運算符

變量名爲e,先替換左邊部分,pFuny爲別名一:void

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。

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

相關文章
相關標籤/搜索