一辜荠、基本用法
#DEFINE
關(guān)鍵字在C/C++中用作宏處理,基本的用法為:
#DEFINE MAX_SIZE 256
在代碼的預(yù)處理階段政冻,編譯器會把所有的宏定義符號替換成被定義的數(shù)據(jù)枚抵,例如以下代碼:
...
#DEFINE MAX_SIZE 10
void f2(){
cout << MAX_SIZE << endl;
}
int main(){
f2();
return 0;
}
使用g++ -E main.cpp -o main2.cpp
預(yù)處理之后代碼會變?yōu)椋?/p>
...
void f2(){
cout << 10 << endl;
}
int main(){
f2();
return 0;
}
二、注意事項
2.1 宏定義不要以分號結(jié)尾
宏定義無需再行尾加上分號明场,如果攜帶分號汽摹,分號也將被看成數(shù)據(jù)的一部分進行替換。例如:
#DEFINE MAX_SIZE 10;
int main(){
cout << MAX_SIZE << endl;
}
編譯時程序?qū)箦eerror: expected primary-expression before ‘<<’ token
苦锨,因為上面的代碼經(jīng)過預(yù)處理后變成了:
cout << 10; << endl;
編譯自然報錯逼泣。
2.2 宏定義最好帶上括號
宏定義時最好帶上括號趴泌,不然可能會導(dǎo)致運算優(yōu)先級出錯。
#DEFINE MUL(x,y) x*y
int main(){
cout << MUL(1+2, 4+6) << endl;
}
經(jīng)過預(yù)處理后的代碼:
cout << 1+2*4+6 << endl;
結(jié)果15
和我們預(yù)想的30
是不一樣的拉庶,為了避免出現(xiàn)這種問題嗜憔,最好把宏定義改成#DEFINE MUL(x,y) ((x)*(y))
。
2.3 宏定義的參數(shù)不要是多次運算后的結(jié)果
#DEFINE MIN( x, y) ((x) < (y) ? x : y)
void f3(){
int i = 1, j = 2;
cout << MIN(i++, ++j) << endl;
}
int main(){
f3();
return 0;
}
這里的結(jié)果會輸出2
氏仗,而實際上我們預(yù)期結(jié)果應(yīng)該是1
吉捶,因為我們希望i++
在cout
語句運行完成后才自加。
三皆尔、define和typedef的區(qū)別
#define
用來定義一個變量或表達式呐舔,在預(yù)處理時會把定義的符號全部替換。
typedef
是類型替換慷蠕,對數(shù)據(jù)類型進行替換珊拼。
兩者的區(qū)別如下:
#define INT_A int*
typedef int* INT_B
INT_A p1, p2, p3; // 只有p1是指針類型,p2和p3是int類型流炕。
INT_B p4, p5, p6; // 三者都是指向int的指針澎现。