C語言typeof詳解

2021-09-30 01:19:16 字數 1855 閱讀 7284

typeof 是 gnu c 標準裡特有的擴充套件,標準的 iso c 並沒有這個關鍵字,所以在編譯的時候不能加任何 iso 的 c 標準選項,否則會報錯。使用時加入-std=gnu90 即 gnu 的標準即可。

typeof的作用類似與sizeof,區別在於sizeof是得到引數的大小而typeof則是推導出引數的型別。

typeof的引數可以是兩種形式:表示式或型別。

如:typeof(int *) a,b;

等價於:

int *a,*b;

typeof構造中的型別名不能包含儲存類說明符,如extern或static。但是typeof允許包含型別限定符,如const或volatile。

例如,下列**是無效的,因為它在typeof構造中宣告了extern:

typeof(extern int) a;

舉乙個linux核心**例子

/* * 選自 linux-2.6.7 核心原始碼 

* filename: linux-2.6.7/include/linux/kernel.h 

*/  

#define min(x,y) ()  

這段比較大小的**非常巧妙,前兩句使用typeof將傳遞的x, y兩個引數(也可能是表示式)轉換為_x, _y兩個變數,同時因為使用typeof的緣故而可以接受不同的資料型別(x, y需相同型別才可比較)。第三句用來檢測x, y的資料型別,由於c語言中沒有 typeof()==typeof() 這樣的用法,這裡巧妙的採用比較兩變數位址的方法來檢測型別,如果_x和_y的型別不一樣,其指標型別也會不一樣,2個不一樣的指標型別進行比較操作,會丟擲乙個編譯警告,達到檢測位址的目的。由於這一句完全無意義,所以前面加 (void) 來忽略 statement with no effect 無效的語句 警告。

一,說明

typeof的引數可以是兩種形式:表示式型別

1,表示式的的例子:

typeof(x[0](1)

這裡假設x是乙個函式指標陣列,這樣就可以得到這個函式返回值的型別了。

如果將typeof用於表示式,則該表示式不會執行。只會得到該表示式的型別。

以下示例宣告了int型別的var變數,因為表示式foo()是int型別的。由於表示式不會被執行,所以不會呼叫foo函式。

extern int foo();

typeof(foo()) var;

2,引數的例子:

typeof(int *) a,b;

等價於:

int *a,*b;

二,例項

1,把y定義成x指向的資料型別:

typeof(*x) y;

2,把y定義成x指向資料型別的陣列:

typeof(*x) y[4];

3,把y定義成乙個字元指標陣列:

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

這與下面的定義等價:

char *y[4];

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

int *p1, *p2;

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

int *p3, p4;

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

int a1[10], a2[10];

C語言typeof詳解

typeof 是 gnu c 標準裡特有的擴充套件,標準的 iso c 並沒有這個關鍵字,所以在編譯的時候不能加任何 iso 的 c 標準選項,否則會報錯。使用時加入 std gnu90 即 gnu 的標準即可。typeof的作用類似與sizeof,區別在於sizeof是得到引數的大小而typeof...

C語言中的typeof

關鍵字typeof用於獲取表示式的資料型別。只有部分編譯器支援,這個特性在linux核心中應用非常廣泛,1.const typeof type 0 member mptr ptr 是定義乙個 mptr指標變數,型別和member的型別一樣 typeof是獲得乙個變數的型別,type 0 member...

C語言的新擴充套件typeof

typeof關鍵字是c語言中的乙個新擴充套件,是對c語言原先32個關鍵字的擴充套件,這一新擴充套件特性在linux的源 中可以經常看到,這一擴充套件是否有在c語言的新標準中,我沒有去驗證,但是據了解,大部分的gnu的c編譯器都支援了這一擴充套件,我在dev c 上也驗證了這一點。下面我們來看看這一擴...