1. 程式人生 > >C語言const和define的區別

C語言const和define的區別

一份 安全 font 預處理 tro span ble 展開 區別

const 定義的是變量不是常量,只是這個變量的值不允許改變是常變量!帶有類型。編譯運行的時候起作用存在類型檢查。

define 定義的是不帶類型的常數,只進行簡單的字符替換。在預編譯的時候起作用,不存在類型檢查。

1、兩者的區別

(1) 編譯器處理方式不同

  • #define 宏是在預處理階段展開。
  • const 常量是編譯運行階段使用。

(2) 類型和安全檢查不同

  • #define 宏沒有類型,不做任何類型檢查,僅僅是展開。
  • const 常量有具體的類型,在編譯階段會執行類型檢查。

(3) 存儲方式不同

  • #define宏僅僅是展開,有多少地方使用,就展開多少次,不會分配內存。(宏定義不分配內存,變量定義分配內存。)
  • const常量會在內存中分配(可以是堆中也可以是棧中)。

(4) const 可以節省空間,避免不必要的內存分配。 例如:

#define NUM 3.14159 //常量宏
const doulbe Num = 3.14159; //此時並未將Pi放入ROM中 ......
double i = Num; //此時為Pi分配內存,以後不再分配!
double I= NUM; //編譯期間進行宏替換,分配內存
double j = Num; //沒有內存分配
double J = NUM; //再進行宏替換,又一次分配內存!

const 定義常量從匯編的角度來看,只是給出了對應的內存地址,而不是象 #define 一樣給出的是立即數,所以,const 定義的常量在程序運行過程中只有一份拷貝(因為是全局的只讀變量,存在靜態區),而 #define 定義的常量在內存中有若幹個拷貝。

(5) 提高了效率。 編譯器通常不為普通const常量分配存儲空間,而是將它們保存在符號表中,這使得它成為一個編譯期間的常量,沒有了存儲與讀內存的操作,使得它的效率也很高。

(6) 宏替換只作替換,不做計算,不做表達式求解;

宏預編譯時就替換了,程序運行時,並不分配內存。

C語言const和define的區別