C語言typeof詳解

2021-08-04 08:04:16 字數 915 閱讀 5718

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 無效的語句 警告

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 上也驗證了這一點。下面我們來看看這一擴...