在C/C++中,預(yù)處理宏需要注意幾點(diǎn):
1)看看兩個(gè)語(yǔ)句:
typedef struct _person
{
char m_strName[16];
int m_nAge;
}*TPPerson;
#define DPPerson \
struct _person \
{ \
char m_strName[16];\
int m_nAge; \
}*
現(xiàn)在我們有如下定義:TPPerson tp1,tp2; DPPerson dp1,dp2;
tp1 = tp2; dp1 = dp2;
上面第一條語(yǔ)句不會(huì)出錯(cuò),沒(méi)有任何問(wèn)題。因?yàn)閠p1,tp2都是對(duì)象指針,但是第二條語(yǔ)句就會(huì)出現(xiàn)問(wèn)題,因?yàn)閐p1是一個(gè)對(duì)象指針,而dp2是一個(gè)對(duì)象,這個(gè)宏隱藏的錯(cuò)誤。
2)define SQUARE(X) (X)*(X)
這是求一個(gè)數(shù)的平方,但是在程序中如果有這樣的語(yǔ)句:int x = 5,y; y = SQUARE(++x),這是一個(gè)邏輯錯(cuò)誤又產(chǎn)生了。求得的實(shí)際值是42,而不是36。
3)字符串定義和標(biāo)志粘貼
看看這兩個(gè)宏定義:
#define TRACE(X) cout<< #X << " = " << X << endl;
#define MEMBER(A) char* A##_string;int A##_size
第一條可以打印出任何一個(gè)表達(dá)式的值,第二條可以把兩個(gè)字符串合并成一個(gè)變量,看下面的例子:
#include
#define TRACE(X) cout<< #X << " = " << X << endl;
#define MEMBER(A) char* A##_string;int A##_size
using namespace std;
int main()
{
for(int i = 0;i < 10;i++)
TRACE((3+i));
MEMBER(one);
one_string = "Hello";
one_size = 4;
cout << one_string << ":" << one_size << endl;
return 0;
}
運(yùn)行結(jié)果是:
(3+i) = 3
(3+i) = 4
(3+i) = 5
(3+i) = 6
(3+i) = 7
(3+i) = 8
(3+i) = 9
(3+i) = 10
(3+i) = 11
(3+i) = 12
Hello:4