const 常量與 #define宏定義的差別
-
-
- const 常量與 #define宏定義的用法
-
參考部落格:
[https://www.cnblogs.com/xumaomao/articles/11049541.html](%5Bhttps://www.cnblogs.com/xumaomao/articles/11049541.html%5D%28https://www.cnblogs.com/xumaomao/articles/11049541.html%29)
https://blog.csdn.net/weibo1230123/article/details/81981384
const 常量與 #define宏定義的用法
define 用法
#define 辨別符 常量
const 用法
const 資料類型 變量名 = 常量
一:差別
(1)就起作用的階段而言: #define是在編譯的預處理階段起作用,而const是在 編譯、運作的時候起作用。
編譯器處理不同
宏定義是一個“編譯時”概念,在預處理階段展開(在編譯時把所有用到宏定義值的地方用宏定義常量替換),不能對宏定義進行調試,生命周期結束于編譯時期;
const常量是一個“運作時”概念,在程式運作使用,類似于一個隻讀行資料
(2)就起作用的方式而言: #define隻是簡單的字元串替換,沒有類型檢查。而const有對應的資料類型,是要進行判斷的,可以避免一些低級的錯誤。
類型和安全檢查不同
宏定義是字元替換,沒有資料類型的差別,同時這種替換沒有類型安全檢查,可能産生邊際效應等錯誤;
const常量是常量的聲明,有類型差別,需要在編譯階段進行類型檢查
(3)就存儲方式而言:#define隻是進行展開,有多少地方使用,就替換多少次,它定義的宏常量在記憶體中有若幹個備份;const定義的隻讀變量在程式運作過程中隻有一份備份。
宏定義是直接替換,不會配置設定記憶體,存儲與程式的代碼段中;const常量需要進行記憶體配置設定
(4)從代碼調試的友善程度而言: const常量可以進行調試的,define是不能進行調試的,因為在預編譯階段就已經替換掉了。
二:const優點
(1)const常量有資料類型,而宏常量沒有資料類型。編譯器可以對前者進行類型安全檢查。而對 define 隻進行字元替換,沒有類型安全檢查,并且在字元替換可能會産生意料不到的錯誤。
(2)有些內建化的調試工具可以對const常量進行調試,但是不能對宏常量進行調試。
(3)const可節省空間,避免不必要的記憶體配置設定,提高效率
三、了解
void f1 ()
{
#define N 12
const int n 12;
}
void f2 ()
{
cout<<N <<endl; //正确,N已經定義過,不受定義域限制
cout<<n <<endl; //錯誤,n定義域隻在f1函數中
}
定義後能否取消
宏定義可以通過 #undef 來使之前的宏定義失效
const 常量定義後将在定義域内永久有效
void f1()
{
#define N 12
const int n = 12;
#undef N //取消宏定義後,即使在f1函數中,N也無效了
#define N 21//取消後可以重新定義
}
總結
宏定義在編譯時把所有用到宏定義值的地方用宏定義常量替換。const常量可以看作是一個隻讀變量,需要指定類型,需要配置設定記憶體,有自己的作用域。
define修飾出來的是真常量。因為,define是宏定義,是宏替換!意味着程式在編譯前期會進行文本替換,例如代碼define PI 3.1415926 這句話,編譯器會将代碼中所有出現PI的地方全部用3.1415926替換,然後在進行編譯,是以本質它就是一個常量嘛!
至于const呢,我們知道const一般修飾于定義變量的前面,比如cosnt int a = 10,意味着a就一直是19,是是一個不可修改的變量了。
往後試圖給a重新指派都會引發錯誤。這就是const修飾之後的結果,但請注意,這裡不可修改的原因其實是編譯器在做檢查,檢查是否有修改這塊記憶體上的值,一旦有就會報錯,是以從根本上說,cosnt修飾的變量依然是一個變量!隻不過編譯器不讓你修改而已!
推薦日常使用中 用 const 變量