天天看點

const常量和宏常量的差別

宏常量的作用是為經常使用的常量定義一個有一定意義的名字,宏常量的格式為:

#define編譯指令的準确含義是,讓編譯器将源碼中的所有辨別符常量替換成替換文本,其效果與使用編輯器手工查找并替換相同。

例如:

編譯預處理指令#define将PI定義為一個要被3.1415926替換的符号,此時PI不是一個變量,而是3.1415926的别名。在編譯開始之前,隻要程式中引用了PI,預處理器就會用#define指令中的值3.1415926來取代它。

宏常量的缺點就是:在被替換成文本之後,記憶體中有同一個替換文本的多份副本。

const常量與變量定義形式相同,隻不過加上const修飾,告訴編譯器,它的值是固定的,不能改變,編譯器會幫着監督和檢查。

例如:

const double PI = 3.1415926;

const推出的目的就是為了取代宏常量,消除其缺點,同時繼承其優點。

在編譯的時候,由于const定義常量隻是給出了對應的記憶體位址,而不是像#define給出的是替換文本,是以const定義的常量在程式運作過程中隻有一份副本,而#define定義的常量在記憶體中有若幹份副本。

簡單總結下:宏常量由于是在預處理部分将所有辨別符替換成相應常量,是以在程式運作過程中,每使用一次宏常量,就需要在記憶體中建立一份副本,而const常量由于是給出了對應的記憶體位址,是以在程式運作過程中隻需要使用該位址下的常量,隻有這一份副本。