程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++常見問題之二#define使用中的陷阱

C++常見問題之二#define使用中的陷阱

編輯:C++入門知識

一.使用#define宏應注意的問題

1.使用宏定義表達式的時候,加括號是一個好習慣

首先我們來看一段簡短的代碼,並試著分析其輸出:

#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.用大括號將宏所定義的多條表達式括起來

我們還是來看一段示例:

#include 

typedef 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 = "<

結果顯示:



其實說來說去還是一個宏替換的范圍問題,改正很簡單,只要在宏定義的時候加上大括號就行了,其實宏是一個很強大的工具,但是我們在用的時候要格外的小心,千萬不要吝啬你的括號。




  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved