define巨集定義和const常量定義之間的區別

woodcol發表於2017-11-03

define:定義預編譯時處理的巨集;
只進行簡單的字元替換,無型別檢測
const:定義程式中的常量,編譯時處理;
常量修飾符,把變數定義為常量
typedef:定義型別別名;
例: typedef int A;
則:A a; //定義a為int

inline:定義行內函數。

 

const定義,大部分編譯器將在編譯的時候進行替換,比如:
const int i=2;
int *p = const_cast<int*>(&i);
*p = 3;
cout<<i;
這裡輸出的還是2,因為在編譯的時候,在cout一句裡,替換了i,為2;
-------------------------------------------------------------
typedef定義,對於複雜的型別,用的比較多,還有就是對於我們便於記憶
如:
typedef int ArrSize;
ArrSize arr;
typedef int(*p)(int) pfun;
pfun mypf;
這裡就定義了一個函式指標
--------------------------------------------------------------------
inline,內斂函式,在執行的時候,不會作為函式處理,也就是不會實際上去做函式呼叫,而是將呼叫處展開
比如:
inline int fun(){cout<<"hello"<<endl;}
呼叫:
fun();
將會展開:
{cout<<"hello"<<endl;}
只適合於簡單的函式,不適合太複雜的函式,因為不進行函式呼叫,所以效率上有所提高,但是,遞迴函式不能作為inline函式
FROM:http://topic.csdn.net/u/20081031/10/53d08ec2-e3a2-4534-b43e-38c53508346c.html

define部分:
巨集不僅可以用來代替常數值,還可以用來代替表示式,甚至是程式碼段。(巨集的功能很強大,但也容易出錯,所以其利弊大小頗有爭議。)

巨集的語法為:

#define 巨集名稱 巨集值

注意,巨集定義不是C或C++嚴格意義上的語句,所以其行末不用加分號結束。

作為一種建議和一種廣大程式設計師共同的習慣,巨集名稱經常使用全部大寫的字母。

利用巨集的優點:

1)讓程式碼更簡潔明瞭

當然,這有賴於你為巨集取一個適當的名字。一般來說,巨集的名字更要注重有明確直觀的意義,有時寧可讓它長點。

2)方便程式碼維護


對巨集的處理,在編譯過程中稱為“預處理”。也就是說在正式編譯前,編譯器必須先將程式碼出現的巨集,用其相應的巨集值替換,這個過程有點你我在文書處理軟體中的查詢替換。所以在程式碼中使用巨集表達常數,歸根結底還是使用了立即數,並沒有明確指定這個量的型別。這容易帶來一些問題,所以C++使用另一更穩妥的方法來代替巨集的這一功能。
const部分

常量定義的格式為:

const 資料型別 常量名 = 常量值;

而const定義的常量具有資料型別,定義資料型別的常量便於編譯器進行資料檢查,使程式可能出現錯誤進行排查。常量必須一開始就指定一個值,然後,在以後的程式碼中,我們不允許改變此常量的值。
兩者之間的區別:
    記憶體空間的分配上。define進行巨集定義的時候,不會分配記憶體空間,編譯時會在main函式裡進行替換,只是單純的替換,不會進行任何檢查,比如型別,語句結構等,即巨集定義常量只是純粹的置放關係,如#define null 0;編譯器在遇到null時總是用0代替null它沒有資料型別(還有疑問請找C語言書籍看預處理部分或者看MSDN.而const定義的常量具有資料型別,定義資料型別的常量便於編譯器進行資料檢查,使程式可能出現錯誤進行排查,所以const與define之間的區別在於const定義常量排除了程式之間的不安全性.
from:http://www.phpweblog.net/maple094/archive/2008/05/30/4054.html


 

相關文章