1. 程式人生 > >typedef、define、constf、inline之間的區別

typedef、define、constf、inline之間的區別

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型別安全檢查