1. 程式人生 > 其它 >巨集定義和const變數/普通函式的區別

巨集定義和const變數/普通函式的區別

巨集定義常量和const變數比較:

1. 巨集定義常量在預處理階段進行替換,不進行型別檢查;

 const變數在編譯階段進行型別檢查;

2. 巨集定義常量不存在於常量表中,系統不為其分配記憶體;

 const變數存在於常量表中,系統為其分配記憶體;

3. 大量使用巨集,每次預編譯都需進行替換,易導致編譯時間過長;

 const變數不存在上述問題;

4. 巨集定義表示式直接進行字串替換,存在邊緣效應;

 const變數不存在上述問題;

// 預想的N值是5
#define N 2+4
// 預想的a的值是3,可實際上a的值是4
int a = N/2; 

巨集定義函式和普通函式比較:

簡短並且被頻繁呼叫的函式經常用函式式巨集定義來代替實現

// 函式式巨集定
#define MAX(a,b) ((a)>(b)?(a):(b))
// 普通函式 
MAX(int a,int b) { return a>b?a:b;}

1. 巨集定義函式的引數沒有型別,前處理器只做形式上的替換,傳參時不做引數型別檢查;

 普通函式的引數有實際型別,傳參時做引數型別檢查;

2. 巨集定義函式本身不進行編譯生成指令,但是在程式碼中每次出現的位置都要編譯生成指令,其編譯生成的目標檔案較大;

 普通函式本身要編譯生成指令,在程式碼中每次出現的位置編譯生成傳參指令和呼叫指令,其編譯生成的目標檔案較小;

3. 巨集定義函式存在邊緣效應,內層括號和外層括號不可以省略;

 普通函式不存在上述情況;

參考連結:https://www.cnblogs.com/dong008259/archive/2011/12/27/2302625.html