天天看點

const 常量與 #define宏定義的差別

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 變量

const 常量與 #define宏定義的差別
const 常量與 #define宏定義的差別

繼續閱讀