首頁  >  文章  >  C語言中typedef和define有什麼差別

C語言中typedef和define有什麼差別

清浅
清浅原創
2019-04-04 09:54:087953瀏覽

typedef和define的差異有:define是預處理編輯器,可定義巨集存在被取代的可能性而typedef是由編輯器處理的,並且遵循範圍規則,可用作定義類型別名

#define是一個C指令,它也是用來定義類似typedef的各種資料型別的別名。但它們之間仍有差別,接下來在文章中具體為大家介紹它們之間的區別,具有一定的參考作用,希望對大家有所幫助

C語言中typedef和define有什麼差別

##【推薦課程:C語言教學

1、預處理器VS編譯器

#define由預處理器處理的,它將#define值從定義點複製貼上到使用點。而typedef是由編譯器處理的,並且是新類型的實際定義。在控制將到達編譯器時,所有#define都將被取代。

差異的影響

(1)typedef要以分號結束而#define不以分號結束

#(2) #define中可能存在替換的副作用,例如:

   typedef char * string_t;         
   #define string_d char *        
   string_t s1,s2; // s1和s2都是char *类型        
   string_d s3,s4; // s3是char *但是s4的类型是char(而不是char *)

第二個聲明中的問題是因為預處理器會將其替換為

char * s3,s4;

這表示s3是char *類型,但s4將是char類型。如果想要所有的變數都成為指標類型就所有變數必須指定*

(3)typedef遵循範圍規則。即在範圍內(函數內)定義了新類型,則只有範圍存在時才會顯示新類型名稱。但是當預處理器遇到#define時,它將取代所有出現的事件(之後沒有範圍規則)。例如:

 int main (){            
 { 
 //新范围开始              
 typedef int myInt_t;                 
 #define myInt_d int                
 myInt_t a;  // a的类型为int                
 myInt_d b;  // b的类型为int            
 } //新范围结束           
 myInt_t c; //错误,输入myInt_t未找到            
 myInt_d d; //d的类型为int        
 }

2、巨集VS類型別名

##define也可用來定義宏,但是typedef只能用於為現有型別提供新名稱(它不能建立新類型)。類似地,#define可以用來定義變數

#define N 10

其實是不會定義N,但是會在整個程式碼中將N替換為10。所以可以用來命名常數。而typedef只能為已定義的類型提供新名稱

3、將typedef作為類型別名##某些類型定義只能使用typedef定義,而不能使用#define定義。例:

(1)為大小為10的整數陣列賦一個新名稱

       typedef int arr [ 10 ] ;

(2)為結構型別賦予新名稱

typedef struct {           
int a;            
char b;        
} myType;

總結:以上就是本篇文章的全部內容了,希望對大家有幫助。

以上是C語言中typedef和define有什麼差別的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn