typeof關鍵字是C語言中的一個新擴展。
typeof的參數可以是兩種形式:表達式或類型。
下面是使用表達式的的例子:
typeof(x[0](1)
這裏假設x是一個函數指針數組,這樣就可以得到這個函數返回值的類型了。
如果將typeof用於表達式,則該表達式不會執行。只會得到該表達式的類型。
以下示例聲明瞭int類型的var變量,因爲表達式foo()是int類型的。由於表達式不會被執行,所以不會調用foo函數。
extern int foo();
typeof(foo()) var;
下面是用類型作參數的例子:
typeof(int *) a,b;
等價於:
int *a,*b;
下面是兩個等效聲明,用於聲明int類型的變量a。
typeof(int) a; /*int類型*/
typeof('b') a; /* GCC中這個表達式的類型是int(自動提升爲int),
注意typeof(char)和typeof('b')得到的不是一樣的,這個用sizeof可以看出來*/
一般情況下用typeof就可以了,但是如果要於ISO C兼容的話,最好是用雙下劃線的形式:__typeof__。
typeof和typedef很像,事實上,只要能用typedef的地方就可以用typeof。
下面是另外一些例子:
把y定義成x指向的數據類型:
typeof(*x) y;
把y定義成x指向數據類型的數組:
typeof(*x) y[4];
把y定義成一個字符指針數組:
typeof(typeof(char *)[4] y;
這與下面的定義等價:
char *y[4];
我們再換一種定義方式:
#define pointer(T) typeof(T *)
#define array(T,N) typeof(T [N])
array (pointer(char),4) y;
如果想把T定義成一個表達式的類型,則我們僅僅用typedef無法做到
但可以通過typeof做到:
typdef typeof(expr) T;
使用typeof的聲明示例
以下示例用於聲明指針和數組。爲了進行對比,還給出了不帶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的聲明限制
請注意,typeof構造中的類型名不能包含存儲類說明符,如extern或static。不過允許包含類型限定符,如const或volatile。
例如,下列代碼是無效的,因爲它在typeof構造中聲明瞭extern:
typeof(extern int) a;
下列代碼使用外部鏈接來聲明標識符b是有效的,表示一個int類型的對象。下一個聲明也是有效的,它聲明瞭一個使用const限定符的char類型指針,表示指針p不能被修改。
extern typeof(int) b;
typeof(char * const) p = "a";
在宏聲明中使用typeof
typeof構造的主要應用是用在宏定義中。可以使用typeof關鍵字來引用宏參數的類型。因此,在沒有將類型名明確指定爲宏實參的情況下,構造帶有所需類型的對象是可能的。
下面是一個交換兩個變量的值的宏定義:
#define SWAP(a,b) {\
typeof(a) _t=a;\
a=b;\
b=_t;}
這個宏可以交換所有基本數據類型的變量(整數,字符,結構等)