typedef與define的用法及區別

2021-09-25 09:50:04 字數 1710 閱讀 8537

關鍵字 typedef: 顧名思義型別定義,這裡應該理解為型別重新命名,從而增強程式的可讀性。

例如:

//將unsigned int 重新命名為uint_32, 所以uint_32也是乙個型別名

typedef

unsigned

int uint_32;

intmain()

關鍵字define:定義乙個識別符號來表示乙個常量。

#define又稱巨集定義,識別符號為所定義的巨集名,簡稱巨集。其功能是將識別符號定義為其後的常量。

特點是:

定義的識別符號不佔記憶體,只是乙個臨時的符號,預編譯後這個符號就不存在了。

在這裡呢,順便一提預編譯:預編譯又叫預處理。預編譯不是編譯,而是編譯前的處理。這個操作是在正式編譯之前由系統自動完成的。

一般形式為:

#define 識別符號 常量 //注意, 最後沒有分號

例如:

#define max 1000   

//定義識別符號常量

#define add(x, y) ((x)+(y))

//定義巨集

區別

本質不同

typedef

是用來定義一種型別的新別名的,它不同於巨集(#define),不是簡單的字串替換。它的新名字具有一定的封裝性,所以新命名的識別符號具有更易定義變數的功能,它是語言編譯過程的一部分,但它並不實際分配記憶體空間。

#define

只是簡單的字串替換(原地擴充套件),它本身並不在編譯過程中進行,而是在這之前(預處理過程)就已經完成了。因此,它不會做正確性檢查,不管含義是否正確它照樣會帶入,只有在編譯已被展開的源程式時才會發現可能的錯誤並報錯。

作用域不同

typedef遵循範圍規則。即在範圍內(函式內)定義了新型別,則只有範圍存在時才會顯示新型別名稱。但是當預處理器遇#define時,它將替換所有出現的事件(之後沒有範圍規則)。

修飾指標型別作用不同:

例如:

typedef int

* p;

#define p int *

const p i;//i不可更改,p指向的內容可以更改,相當於 int * const p;

const p i;//i可以更改,p指向的內容不能更改,相當於 const int *p;或 int

注意:建立新的型別名應該使用typedef而不是#define,因為後者無法正確處理指標型別

例如:

#define d_ptr_to_char char*

d_ptr_to_char a,b;

正確地宣告了a,但是b卻被宣告為乙個字元。

而typedef卻可以完全正確的宣告

typedef char* d_ptr_to_char

d_ptr_to_char a,b;

typedef與 define 的區別

一 typedef的用法 typedef常用來定義乙個識別符號及關鍵字的別名,它是語言編譯過程的一部分,但它並不實際分配記憶體空間,例項像 typedef int int typedef int array 10 typedef int pint typedef可以增強程式的可讀性,以及識別符號的靈...

typedef與 define 的區別

typedef與 define 的區別 一 typedef的用法 typedef常用來定義乙個識別符號及關鍵字的別名,它是語言編譯過程的一部分,但它並不實際分配記憶體空間,例項像 typedef int int typedef int array 10 typedef int pint typede...

typedef與 define的區別

typedef與 define的區別 從以上的概念便也能基本清楚,typedef只是為了增加可讀性而為識別符號另起的新名稱 僅僅只是個別名 而 define 原本在c中是為了定義常量,到了c const enum inline的出現使它也漸漸成為了起別名的工具。有時很容易搞不清楚與typedef兩者...