(1)就起作用的階段而言:#define是在編譯的預處理階段起作用(在預處理階段進行替換),而const是在編譯執行的時候起作用(const修飾的唯讀變數是在編譯的時候確定其值)
(2)就起作用的方式而言:#define只是簡單的字串替換,沒有型別檢查。而const有對應的型別,是要進行判斷的,可以避免一些低階的錯誤
(3)就儲存方式而言:#define只是進行展開,有多少地方使用,就替換多少次。它定義的巨集常量在記憶體中存若干個備份;const定義的唯讀變數在程式中只有乙份備份
(4)從**除錯的方便程度而言:const常量可以進行除錯的,define是不能進行除錯的,因為在預編譯階段就已經進行替換了
(5)就記憶體分配而言:編譯器通常不為普通的const唯讀變數分配儲存空間,而是將它們儲存在符號表中,這使得它成為乙個編譯期間的值,沒有了儲存與讀記憶體的操作,使得它的效率也很高
#define m 3
const int n = 5; //此時並未將n放入記憶體中
int i = n;此時為n分配記憶體,以後不再分配
int l = m;//預編譯期間進行巨集替換,分配記憶體
int j = n;//沒有記憶體分配
int j = m;//再進行巨集替換,又一次分配記憶體
const定義的唯讀變數從彙編的角度來看,只是給出了對應的記憶體位址,而不是像#define一樣給出的是立即數,所以,const定義的唯讀變數在程式執行過程中只有乙份拷貝(因為它是全域性的唯讀變數,存放在靜態區),而#define定義的巨集常量在記憶體中有若干個拷貝。
(1)const常量有資料型別,而巨集常量沒有資料型別,編譯器可以對const進行型別安全檢查,而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換可能會產生意料不到的錯誤
(2)有些整合化的除錯工具可以對const常量進行除錯,但是不能對巨集常量進行除錯
(4)const在記憶體中只儲存了乙份,節省了空間,避免不必要的記憶體分配,提高了效率
const和define的區別
1 編譯器處理方式不同 define巨集是在預處理階段展開。const常量是編譯執行階段使用。2 型別和安全檢查不同 define巨集沒有型別,不做任何型別檢查,僅僅是展開。const常量有具體的型別,在編譯階段會執行型別檢查。3 儲存方式不同 define巨集僅僅是展開,有多少地方使用,就展開多少...
const和 define的區別
1 const定義的常量是有型別的,define定義的常量是沒有型別的 這就意味著會對前者做乙個型別的檢查,對 define則是做乙個簡單的替換 2 const定義的常量在編譯的時候分配記憶體,而 define定義的常量在預編譯的時候進行替換,不分配記憶體 3 作用域不同,const定義的常變數的作...
const和define的區別
1 編譯器處理方式不同 define巨集是在預處理階段展開。const常量是編譯執行階段使用。2 型別和安全檢查不同 define巨集沒有型別,不做任何型別檢查,僅僅是展開。const常量有具體的型別,在編譯階段會執行型別檢查。3 儲存方式不同 define巨集僅僅是展開,有多少地方使用,就展開多少...