typeof與tpyedef的區別

來源:互聯網
上載者:User

 轉自:

http://blog.csdn.net/gexueyuan/article/details/6930228

理解1:

typedef用來定義類型別名,c/c++裡都有,屬於語言的一個特性,和mfc無關

比如
typedef int* intptr;
intptr a; // 相當於int* a;

typeof,我所知道的是gcc中對c/c++文法的一個擴充,用來靜態擷取參數類型
比如
int a = 3;
typeof(a) b = 4; // 相當於 int b = 4;
typeof("12345") c = "abcde"; // 相當於 const char c[6] = "abcde"

vector<typeof(1.234)> a; // 相當於 vector<double> a;

理解2:

轉自:http://blog.csdn.net/wslong/article/details/7728811

typeof關鍵字是C語言中的一個新擴充。

typeof的參數可以是兩種形式:運算式類型
下面是使用運算式的的例子:
    typeof(x[0](1)
這裡假設x是一個函數指標數組,這樣就可以得到這個函數傳回值的類型了。
如果將typeof用於運算式,則該運算式不會執行。只會得到該運算式的類型。
以下樣本聲明了int類型的var變數,因為運算式foo()是int類型的。由於運算式不會被執行,所以不會調用foo函數。
   extern int foo();
   typeof(foo()) var;

下面是用類型作參數的例子:
   typeof(int *) a,b;
等價於:
   int *a,*b;

下面是兩個等效聲明,用於聲明int類型的變數a。
   typeof(int) a; /*int類型*/
   typeof('b') a; /* GCC中這個運算式的類型是int(自動提升為int),
                  注意typeof(char)和typeof('b')得到的不是一樣的,這個用sizeof可以看出來*/

一般情況下用typeof就可以了,但是如果要於ISO C相容的話,最好是用雙底線的形式:__typeof__。
typeof和typedef很像,事實上,只要能用typedef的地方就可以用typeof。

下面是另外一些例子:
把y定義成x指向的資料類型:
   typeof(*x) y;
把y定義成x指向資料類型的數組:
   typeof(*x) y[4];
把y定義成一個字元指標數組:
   typeof(typeof(char *)[4] y;
這與下面的定義等價:
   char *y[4];

我們再換一種定義方式:
   #define pointer(T) typeof(T *)
   #define array(T,N) typeof(T [N])
   array (pointer(char),4) y;

如果想把T定義成一個運算式的類型,則我們僅僅用typedef無法做到
但可以通過typeof做到:
   typdef typeof(expr) T;

使用typeof的聲明樣本
以下樣本用於聲明指標和數組。為了進行對比,還給出了不帶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的聲明限制
請注意,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關鍵字來引用宏參數的類型。因此,在沒有將類型名明確指定為宏實參的情況下,構造帶有所需類型的對象是可能的。
下面是一個交換兩個變數的值的宏定義:
   #define SWAP(a,b) {\
      typeof(a) _t=a;\
      a=b;\
      b=_t;}
這個宏可以交換所有基礎資料型別 (Elementary Data Type)的變數(整數,字元,結構等)

參考:
http://blog.chinaunix.net/u3/101356/showart_2081601.html
http://gcc.gnu.org/onlinedocs/gcc/Typeof.html#Typeof

typeof關鍵字是C語言中的一個新擴充。

typeof的參數可以是兩種形式:運算式類型
下面是使用運算式的的例子:
    typeof(x[0](1)
這裡假設x是一個函數指標數組,這樣就可以得到這個函數傳回值的類型了。
如果將typeof用於運算式,則該運算式不會執行。只會得到該運算式的類型。
以下樣本聲明了int類型的var變數,因為運算式foo()是int類型的。由於運算式不會被執行,所以不會調用foo函數。
   extern int foo();
   typeof(foo()) var;

下面是用類型作參數的例子:
   typeof(int *) a,b;
等價於:
   int *a,*b;

下面是兩個等效聲明,用於聲明int類型的變數a。
   typeof(int) a; /*int類型*/
   typeof('b') a; /* GCC中這個運算式的類型是int(自動提升為int),
                  注意typeof(char)和typeof('b')得到的不是一樣的,這個用sizeof可以看出來*/

一般情況下用typeof就可以了,但是如果要於ISO C相容的話,最好是用雙底線的形式:__typeof__。
typeof和typedef很像,事實上,只要能用typedef的地方就可以用typeof。

下面是另外一些例子:
把y定義成x指向的資料類型:
   typeof(*x) y;
把y定義成x指向資料類型的數組:
   typeof(*x) y[4];
把y定義成一個字元指標數組:
   typeof(typeof(char *)[4] y;
這與下面的定義等價:
   char *y[4];

我們再換一種定義方式:
   #define pointer(T) typeof(T *)
   #define array(T,N) typeof(T [N])
   array (pointer(char),4) y;

如果想把T定義成一個運算式的類型,則我們僅僅用typedef無法做到
但可以通過typeof做到:
   typdef typeof(expr) T;

使用typeof的聲明樣本
以下樣本用於聲明指標和數組。為了進行對比,還給出了不帶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的聲明限制
請注意,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關鍵字來引用宏參數的類型。因此,在沒有將類型名明確指定為宏實參的情況下,構造帶有所需類型的對象是可能的。
下面是一個交換兩個變數的值的宏定義:
   #define SWAP(a,b) {\
      typeof(a) _t=a;\
      a=b;\
      b=_t;}
這個宏可以交換所有基礎資料型別 (Elementary Data Type)的變數(整數,字元,結構等)

參考:
http://blog.chinaunix.net/u3/101356/showart_2081601.html
http://gcc.gnu.org/onlinedocs/gcc/Typeof.html#Typeof

typeof關鍵字是C語言中的一個新擴充。

typeof的參數可以是兩種形式:運算式類型
下面是使用運算式的的例子:
    typeof(x[0](1)
這裡假設x是一個函數指標數組,這樣就可以得到這個函數傳回值的類型了。
如果將typeof用於運算式,則該運算式不會執行。只會得到該運算式的類型。
以下樣本聲明了int類型的var變數,因為運算式foo()是int類型的。由於運算式不會被執行,所以不會調用foo函數。
   extern int foo();
   typeof(foo()) var;

下面是用類型作參數的例子:
   typeof(int *) a,b;
等價於:
   int *a,*b;

下面是兩個等效聲明,用於聲明int類型的變數a。
   typeof(int) a; /*int類型*/
   typeof('b') a; /* GCC中這個運算式的類型是int(自動提升為int),
                  注意typeof(char)和typeof('b')得到的不是一樣的,這個用sizeof可以看出來*/

一般情況下用typeof就可以了,但是如果要於ISO C相容的話,最好是用雙底線的形式:__typeof__。
typeof和typedef很像,事實上,只要能用typedef的地方就可以用typeof。

下面是另外一些例子:
把y定義成x指向的資料類型:
   typeof(*x) y;
把y定義成x指向資料類型的數組:
   typeof(*x) y[4];
把y定義成一個字元指標數組:
   typeof(typeof(char *)[4] y;
這與下面的定義等價:
   char *y[4];

我們再換一種定義方式:
   #define pointer(T) typeof(T *)
   #define array(T,N) typeof(T [N])
   array (pointer(char),4) y;

如果想把T定義成一個運算式的類型,則我們僅僅用typedef無法做到
但可以通過typeof做到:
   typdef typeof(expr) T;

使用typeof的聲明樣本
以下樣本用於聲明指標和數組。為了進行對比,還給出了不帶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的聲明限制
請注意,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關鍵字來引用宏參數的類型。因此,在沒有將類型名明確指定為宏實參的情況下,構造帶有所需類型的對象是可能的。
下面是一個交換兩個變數的值的宏定義:
   #define SWAP(a,b) {\
      typeof(a) _t=a;\
      a=b;\
      b=_t;}
這個宏可以交換所有基礎資料型別 (Elementary Data Type)的變數(整數,字元,結構等)

參考:
http://blog.chinaunix.net/u3/101356/showart_2081601.html
http://gcc.gnu.org/onlinedocs/gcc/Typeof.html#Typeof

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.