【C++學習筆記】C++巨集的定義用法總結
阿新 • • 發佈:2018-12-03
本文轉載自:https://www.cnblogs.com/jjzzx/p/5122494.html
- 第一種用法——配合條件編譯:#define DEBUG
定義一個叫DEBUG的識別符號。它應該與#ifdef或#ifndef配合使用。舉例如下:
#define DEBUG
#ifdef DEBUG
void print(int v) { cout << v << endl;}
#else
void print(int) {}
#endif
如果符號DEBUG存在,那麼編譯器會編譯上面的、能輸出數值的print,否則編譯器編譯下面的、什麼事情都不做的print。
把上面的#ifdef換成#ifndef,那麼編譯的程式碼正好上面所說的相反。
2.第二種用法——表示式:
#define N 5000
編譯時,編譯器會用類似於“查詢和替換”的方法,把程式碼中的N換成5000。如果需要換成表示式,應該用括號把它們包圍。例如:
#define a 1+2
#define b (1+2)
c=a*2; d=b*2;
編譯時上面一行會變成“c=1+2*2; d=(1+2)*1;”,顯然它們的值是不同的。
此外,要注意表示式末尾不能有分號(除非你需要)。
3.第三種用法——簡易“函式”
#define FtoC(a) (((a)-32)/9*5)
這類似於一個函式。不過,由於編譯器只是進行簡單替換,所以為了安全,a、b應該用括號包圍,整個表示式也應該用括號包圍。
這種“函式”用法和普通函式一樣,且速度更快。然而,它很容易出現難以查出的錯誤。所以,請用行內函數(inline)代替巨集定義。
注意,不要在“引數”中改變變數的值!
4.第四種用法——簡化一段程式碼:
#define move(dx, dy) if (isfull(dir)) return; \ if (map(x+dx, y+dy)=='0') \ { \ push(dir,x+dx,y+dy,head[dir], dep); \ check(dir); \ }
不要忘記每行後面的“\”,它相當於換行符。這次move簡化了一大段程式碼。當然,在c++中行內函數也可以實現這種功能的。