const與#define的區別、優點


const與#define的區別

編譯器處理方式不同

define宏是在預處理階段展開。

補充:預處理器根據以#開頭的命令,修改原始的程序。比如我們常見的#include <stdio.h>命令告訴處理器讀取系統頭文件stdio.h的內容,並把它直接插入程序文本中。咱們的#define也是,僅僅是單純的文本替換。

const常量是編譯運行階段使用。

類型和安全檢查不同

define宏沒有數據類型,不做任何類型檢查,僅僅是展開。

const常量有具體的數據類型,在編譯階段會執行類型檢查。

存儲方式不同

define宏僅僅是展開,有多少地方使用,就展開多少次,不會分配內存。

const常量會在內存中分配(可以是堆中也可以是棧中)。

const  可以節省空間,避免不必要的內存分配。

例如:

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

const定義常量從匯編的角度來看,只是給出了對應的內存地址,而不是象#define一樣給出的是立即數,所以,const定義的常量在程序運行過程中只有一份拷貝,而 #define定義的常量在內存中有若干個拷貝。

代碼調試不同

const常量可以進行調試的。

define是不能進行調試的,因為在預編譯階段就已經替換掉了。

const優點

const常量有數據類型,而宏常量沒有數據類型。編譯器可以對前者進行類型安全檢查。而對后者只進行字符替換,沒有類型安全檢查,並且在字符替換可能會產生意料不到的錯誤。

有些集成化的調試工具可以對const常量進行調試,但是不能對宏常量進行調試。

const可節省空間,避免不必要的內存分配,提高效率。

#define的優點

宏可以定義一些函數,const不可以

宏可以使代更碼簡潔

使用宏可以方便代碼維護

宏還可以定義帶參數的宏,做到一定程度的泛型(利用#或者##操作符)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM