define
常見用法:
1.定義簡單的常數:定義常量,便於修改(切不可在後面加上分號!)
#define N 1000
等效於
const int N = 1000;
但略有不同,define只是簡單替換,而不是作為一個變數來使用.
2. 定義簡單的函數:注意多使用括弧 define可以像函數那樣接受一些參數,如下:
#define max(x,y) (x)>(y)?(x):(y);
3.條件編譯(防止重複包括 重複定義)
4.定義單行宏,多行宏
與const比較部分
- const常量有資料類型,而宏常量沒有資料類型。編譯器可以對前者進行型別安全檢查。而#define 只作簡單的字串替換,無型別安全檢查。
- const在編譯時間分配儲存空間;而#define在先行編譯時編譯,不分配儲存空間。
關於const的詳解見先下表
援引自:http://blog.csdn.net/eric_jo/article/details/4138548
|
1 |
可以定義const常量 |
|
const int Max = 100; |
|
2 |
便於進行類型檢查 |
const常量有資料類型,而宏常量沒有資料類型。編譯器可以對前者進行型別安全檢查,而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換時可能會產生意料不到的錯誤 |
void f(const int i) { .........} //對傳入的參數進行類型檢查,不匹配進行提示 |
|
3 |
可以保護被修飾的東西 |
防止意外的修改,增強程式的健壯性。 |
void f(const int i) { i=10;//error! } //如果在函數體內修改了i,編譯器就會報錯 |
|
4 |
可以很方便地進行參數的調整和修改 |
同宏定義一樣,可以做到不變則已,一變都變 |
|
|
5 |
為函數重載提供了一個參考 |
|
class A { ...... void f(int i) {......} //一個函數 void f(int i) const {......} //上一個函數的重載 ...... }; |
|
6 |
可以節省空間的,避免不必要的記憶體配置 |
const定義常量從彙編的角度來看,只是給出了對應的記憶體位址,而不是象#define一樣給出的是立即數,所以,const定義的常量在程式運行過程中只有一份拷貝,而#define定義的常量在記憶體中有若干個拷貝 |
#define PI 3.14159 //常量宏 const doulbe Pi=3.14159; //此時並未將Pi放入ROM中 ...... double i=Pi; //此時為Pi分配記憶體,以後不再分配! double I=PI; //編譯期間進行宏替換,分配記憶體 double j=Pi; //沒有記憶體配置 double J=PI; //再進行宏替換,又一次分配記憶體! |
|
7 |
提高了效率 |
編譯器通常不為普通const常量分配儲存空間,而是將它們儲存在符號表中,這使得它成為一個編譯期間的常量,沒有了儲存與讀記憶體的操作,使得它的效率也很高 |
|