首先我們來看一段簡短的代碼,並試著分析其輸出:
#include#define Add(a,b) a+b int main() { std::cout<
結果輸出:
<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+utzP1Mi7o6y1sc7Sw8e/tLW91eLDtNK7ts60+sLrtcTKsbryo6y/z7aou+Hf2tau0tSxx6OsyM/OqtXiw7S88rWltcS07c7z1PXDtL/JxNy3os/WsrvBy6O/sfC8saOs1eK7uda7yse/qsq8o6zPwsPmztLDx9TattTJz8r2tPrC67340NC4xL34o6yx49PQwcvPwsPmtcS0+sLro7o8L3A+CjxwPjxwcmUgY2xhc3M9"brush:java;">#include
#define Add1(a,b) (a+b) #define Add2(a,b) (a) + (b) #define Mul(a,b) (a*b) int main() { std::cout<
結果輸出:
上述結果表明,即使是整體加上括號或者分別單獨加上括號都不能很好的解決問題,最完備的解決方案就是不要吝啬你的括號,用完備的括號完備的保護每一個宏參數,也就是說,針對上述案例,應該這樣:
#define Add(a,b) ((a)+(b))
#define Mul(a,b) ((a)*(b))
2.使用宏的時候,參數不能變化
首先,照例我們還是來看一段問題代碼:
#include#define CUBE(a) ((a)*(a)*(a)) inline int Cube(int a) { return a*a*a; } int main() { int base1 = 2,base2=2; int nCube1 = CUBE(++base1); int nCube2 = Cube(++base2); std::cout<<"nCube1 = "<
再看一下輸出結果:
其實這樣的結果也很好理解,因為宏是單純的替換,每一次替換都自增了一次,這就是宏在展開時對其參數的多次取值替換所帶來的副作用,為避免這種情況,最簡單的方法就是保證使用宏的時候參數不能變換。
3.用大括號將宏所定義的多條表達式括起來
我們還是來看一段示例:
#includetypedef struct Cube { int x; int y; int z; }; #define INITIAL(a,b,c)\ a=1;\ b=2;\ c=3; int main() { int x,y,z; INITIAL(x,y,z); std::cout<<"x = "<
結果顯示:
其實說來說去還是一個宏替換的范圍問題,改正很簡單,只要在宏定義的時候加上大括號就行了,其實宏是一個很強大的工具,但是我們在用的時候要格外的小心,千萬不要吝啬你的括號。