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不可以
宏可以使代更碼簡潔
使用宏可以方便代碼維護
宏還可以定義帶參數的宏,做到一定程度的泛型(利用#或者##操作符)