原文:http://hi.baidu.com/leowang715/blog/item/b0b96d6f972e7dd080cb4a06.html
typeof關鍵字是C語言中的一個新擴展。只要可以接受typedef名稱,Sun Studio C 編譯器就可以接受帶有typeof的結構,包括以下語法類別:
- 聲明
- 函數聲明符中的參數類型鏈表和返回類型
- 類型定義
- 類型操作符s
- sizeof操作符
- 複合文字
- typeof實參
編譯器接受帶雙下劃線的關鍵字:__typeof和__typeof__。本文中的例子並沒有遵循使用雙下劃線的慣例。從語句構成上看,typeof關鍵字後帶圓括號,其中包含類型或表達式的名稱。這類似於sizeof關鍵字接受的操作數(與sizeof不同的是,位字段允許作爲typeof實參,並被解釋爲相應的整數類型)。從語義上看,typeof 關鍵字將用做類型名(typedef名稱)並指定類型。
使用typeof的聲明示例
下面是兩個等效聲明,用於聲明int類型的變量a。
typeof(int) a; /* Specifies variable a which is of the type int */
typeof('b') a; /* The same. typeof argument is an expression consisting of
character constant which has the type int */
以下示例用於聲明指針和數組。爲了進行對比,還給出了不帶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用於表達式,則該表達式不會執行。只會得到該表達式的類型。以下示例聲明瞭int類型的var變量,因爲表達式foo()是int類型的。由於表達式不會被執行,所以不會調用foo函數。
extern int foo();
typeof(foo()) var;
使用typeof的聲明限制
請注意,typeof構造中的類型名不能包含存儲類說明符,如extern或static。不過允許包含類型限定符,如const或volatile。例如,下列代碼是無效的,因爲它在typeof構造中聲明瞭extern:
typeof(extern int) a;
下列代碼使用外部鏈接來聲明標識符b是有效的,表示一個int類型的對象。下一個聲明也是有效的,它聲明瞭一個使用const限定符的char類型指針,表示指針p不能被修改。
extern typeof(int) b; typeof(char * const) p = "a";
在宏聲明中使用typeof
typeof構造的主要應用是用在宏定義中。可以使用typeof關鍵字來引用宏參數的類型。