typedef、define、constf、inline之間的區別
阿新 • • 發佈:2019-01-14
1.typedef和#define的區別
typedef int* pInt; int a = 1, b = 2; const pInt p1 = &a; //p1是常量指標 pInt const p2 = &b; //p2是常量指標 //這裡的const就是拿來修飾p1、p2的,跟pInt沒關係
1)作用:typedef定義了一個新的型別別名,而#define(巨集定義)只是簡單的替換
2)型別安全檢查:用typedef定義時有型別安全檢查,而#define是簡單的替換,沒有型別安全檢查
3)處理階段:typedef在編譯階段處理,而#define是預處理指令,在預編譯階段
4)作用域:typedef在它定義域內有效,而#define一旦定義將不受定義域限制(即使在區域性定義也在全域性範圍內有效)
5)能否被取消:typedef定義後不能被取消,而#define可以用定義後可以用#undef取消
void f1() { #define N 15 const int n =12; cout << N << endl; } void f2() { cout << N << endl; //正確,N已經定義過,不受定義域限制 #undef N cout << N << endl; //錯誤,N的定義被取消 cout << n << endl; //錯誤,n定義域只在f1函式中 }
6)與指標有關的操作:
#define pD int* typedef int* pT; int a = 1, b = 2; const pT p1 = &a; //p1是常量指標 pT const p2 = &b; //p2是常量指標 //pT是一種型別,這裡的const是拿來修飾p1、p2的,跟pT沒關係 const pD p3 = &a; //p3是指向常量的指標 pD const p4 = &b; //p4是常量指標//pD是簡單的替換 pD p5, p6; //p5是指標,p6是int變數 pT p7, p8; //p7和p8都是指標
2.#define和const的區別
1)兩者都可以用來定義常量
2)處理階段:#define是預處理指令,在預編譯階段處理,而const在編譯階段和執行(連結?)階段處理
3)型別安全檢查:#define是簡單的替換,沒有型別安全檢查,而const常量有具體的型別,有型別安全檢查
4)佔用空間:#define僅僅佔用程式碼空間,const修飾的全域性變數佔用常量段空間,const修飾的區域性變數佔用棧段空間
5)能否被取消:#define定義後可以用#undef取消,const定義後不能被取消
3.#define和inline的區別
1)作用:#define是關鍵字,是簡單的替換,而inline是函式,inline(內聯)函式對編譯器提出建議,是否進行巨集替換,編譯器有權拒絕
2)處理階段:#define是預處理指令,在預編譯階段處理,而inline在編譯階段處理
3)型別安全檢查:#define沒有型別安全檢查,而inline有型別安全檢查