關鍵字 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兩者...