C語(yǔ)言中的typeof關(guān)鍵字

typeof關(guān)鍵字是C語(yǔ)言中的一個(gè)新擴(kuò)展。

typeof的參數(shù)可以是兩種形式:表達(dá)式類型。

下面是使用表達(dá)式的的例子:

typeof(x[0](1)

這里假設(shè)x是一個(gè)函數(shù)指針數(shù)組,這樣就可以得到這個(gè)函數(shù)返回值的類型了。

如果將typeof用于表達(dá)式,則該表達(dá)式不會(huì)執(zhí)行。只會(huì)得到該表達(dá)式的類型。

以下示例聲明了int類型的var變量,因?yàn)楸磉_(dá)式foo()是int類型的。由于表達(dá)式不會(huì)被執(zhí)行,所以不會(huì)調(diào)用foo函數(shù)。

extern int foo();

typeof(foo()) var;

下面是用類型作參數(shù)的例子:

typeof(int *) a,b;

等價(jià)于:

int *a,*b;

下面是兩個(gè)等效聲明,用于聲明int類型的變量a。

typeof(int) a; /*int類型*/

typeof('b') a; /* GCC中這個(gè)表達(dá)式的類型是int(自動(dòng)提升為int),

注意typeof(char)和typeof('b')得到的不是一樣的,這個(gè)用sizeof可以看出來(lái)*/

一般情況下用typeof就可以了,但是如果要于ISO C兼容的話,最好是用雙下劃線的形式:__typeof__。

typeof和typedef很像,事實(shí)上,只要能用typedef的地方就可以用typeof。

下面是另外一些例子:

把y定義成x指向的數(shù)據(jù)類型:

typeof(*x) y;

把y定義成x指向數(shù)據(jù)類型的數(shù)組:

typeof(*x) y[4];

把y定義成一個(gè)字符指針數(shù)組:

typeof(typeof(char *)[4] y;

這與下面的定義等價(jià):

char *y[4];

我們?cè)贀Q一種定義方式:

#define pointer(T) typeof(T *)

#define array(T,N) typeof(T [N])

array (pointer(char),4) y;

如果想把T定義成一個(gè)表達(dá)式的類型,則我們僅僅用typedef無(wú)法做到

但可以通過(guò)typeof做到:

typdef typeof(expr) T;

使用typeof的聲明示例

以下示例用于聲明指針和數(shù)組。為了進(jìn)行對(duì)比,還給出了不帶typeof的等效聲明。

typeof(int *) p1,p2; /* Declares two int pointers p1, p2 */

int *p1, *p2;

typeof(int) *p3,p4;/* Declares int pointer p3 and int p4 */

int *p3, p4;

typeof(int [10]) a1, a2;/* Declares two arrays of integers */

int a1[10], a2[10];

使用typeof的聲明限制

請(qǐng)注意,typeof構(gòu)造中的類型名不能包含存儲(chǔ)類說(shuō)明符,如extern或static。不過(guò)允許包含類型限定符,如const或volatile。

例如,下列代碼是無(wú)效的,因?yàn)樗趖ypeof構(gòu)造中聲明了extern:

typeof(extern int) a;

下列代碼使用外部鏈接來(lái)聲明標(biāo)識(shí)符b是有效的,表示一個(gè)int類型的對(duì)象。下一個(gè)聲明也是有效的,它聲明了一個(gè)使用const限定符的char類型指針,表示指針p不能被修改。

extern typeof(int) b;

typeof(char * const) p = "a";

在宏聲明中使用typeof

typeof構(gòu)造的主要應(yīng)用是用在宏定義中。可以使用typeof關(guān)鍵字來(lái)引用宏參數(shù)的類型。因此,在沒(méi)有將類型名明確指定為宏實(shí)參的情況下,構(gòu)造帶有所需類型的對(duì)象是可能的。

下面是一個(gè)交換兩個(gè)變量的值的宏定義:

#define SWAP(a,b) {\

typeof(a) _t=a;\

a=b;\

b=_t;}

這個(gè)宏可以交換所有基本數(shù)據(jù)類型的變量(整數(shù),字符,結(jié)構(gòu)等)

參考:

http://blog.chinaunix.net/u3/101356/showart_2081601.html

http://gcc.gnu.org/onlinedocs/gcc/Typeof.html#Typeof

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容