C語言中的typeof關鍵字

2021-09-29 20:10:01 字數 2322 閱讀 9570

參考:

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;
extern typeof(int) b;

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

在巨集宣告中使用typeof

typeof構造的主要應用是用在巨集定義中。可以使用typeof關鍵字來引用巨集引數的型別。因此,在沒有將型別名明確指定為巨集實參的情況下,構造帶有所需型別的物件是可能的。

下面是乙個交換兩個變數的值的巨集定義:

#define swap(a,b)

這個巨集可以交換所有基本資料型別的變數(整數,字元,結構等)

c語言中typeof關鍵字

c語言中typeof關鍵字 下面這兩個等效宣告,用於宣告int類弄的變數a typeof int a typeof b a 相當於獲取 b 的型別,定義乙個變數a 下面用於宣告指標和陣列 typeof int p1,p2 typeof p1 p2 p1與p2的型別一致 int p1,p2 typeo...

C語言中的typeof關鍵字

typeof關鍵字是c語言中的乙個新擴充套件。typeof的引數可以是兩種形式 表示式或型別。下面是使用表示式的的例子 typeof x 0 1 這裡假設x是乙個函式指標陣列,這樣就可以得到這個函式返回值的型別了。如果將typeof用於表示式,則該表示式不會執行。只會得到該表示式的型別。以下示例宣告...

C語言中的typeof關鍵字

typeof關鍵字是c語言中的乙個新擴充套件。typeof的引數可以是兩種形式 表示式或型別。下面是使用表示式的的例子 typeof x 0 1 這裡假設x是乙個函式指標陣列,這樣就可以得到這個函式返回值的型別了。如果將typeof用於表示式,則該表示式不會執行。只會得到該表示式的型別。以下示例宣告...