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