原文地址
http://bbs.chinaunix.net/thread-3595195-1-1.html
另一種引用一個表達式類型的方法就是使用typeof,使用這個關鍵字的語法看上去有點像使用sizeof,但從本質上講,它更像是使用typedef定義一個類型名稱。
可以使用表達式或是一個類型名來引用類型。比如下面是一個使用表達式的例子:
typeof (x[0](1))
這裏假設x是一個指向多個函數的指針數組。這裏得到的類型實際是函數值的類型。
下面是一個使用類型名的例子:
typeof (int *)
這裏得到的類型是指向int型的指針
如果你要把typeof寫在頭文件中,而且這些頭文件是要用在ISO C程序中,那麼應該寫成__typeof__而不是typeof
typeof能被用在任何需要引用類型名的情況下,比如你可以用在聲明、顯示類型轉換(cast)或是在sizeof和typeof內使用。
typeof在協助內嵌表達式的聲明時非常有用。這裏演示一個如何定義一個安全(在任何情況下,各參數只會被計算一次)的求最大值的宏。
#define max(a,b)
({
typeof (a) _a = (a);
typeof (b) _b = (b);
_a > _b ? _a : _b;
})
讓局部變量名以下劃線開關的原因是避免與內嵌表達式被使用時傳進來的參數名相沖突。我們更希望建立一種新的語法規則,按照這種語法規則,聲明的變量的作用域只在該變量初始化之後。相信這會是一種更加可靠的避免衝突的方法。
一些別的使用typeof的例子:
1、y的類型與x所指向的類型相同
typeof (*x) y;
2、 y的類型是指向字符的指針數組
typeof ( typeof (char *) [4]) y;
這與傳統C的方法char *y[4];作用相同
來看看使用typeof聲明的意義以及爲什麼說它很用:
#define pointer(T) typeof (T *)
#define array(T, N) typeof(T [N])
於是聲明就可以寫成以下形式:
array (pointer (char), 4) y;
因此y的類型就是有四個元素、這些元素指向char類型的指針數組。
關於兼容性:在GCC 2中提供了一個更加侷限的擴展,這個擴展允許用戶使用typedef T = expr;以使T類型與expr類型相同。這個擴展在GCC3.0和3.2版本中會出現問題,在3.2.1及以後的版本中會報錯。不過可以用下面的方法來重寫:
typedef typeof(expr) T;
這種方法寫的代碼在所有GCC版本中都可行