在C/C++中,預處理宏需要注意幾點:
1)看看兩個語句:
typedef struct _person
{
char m_strName[16];
int m_nAge;
}*TPPerson;
#define DPPerson \
struct _person \
{ \
char m_strName[16];\
int m_nAge; \
}*
現在我們有如下定義:TPPerson tp1,tp2; DPPerson dp1,dp2;
tp1 = tp2; dp1 = dp2;
上面第一條語句不會出錯,沒有任何問題。因為tp1,tp2都是對象指針,但是第二條語句就會出現問題,因為dp1是一個對象指針,而dp2是一個對象,這個宏隱藏的錯誤。
2)define SQUARE(X) (X)*(X)
這是求一個數的平方,但是在程序中如果有這樣的語句:int x = 5,y; y = SQUARE(++x),這是一個邏輯錯誤又產生了。求得的實際值是42,而不是36。
3)字符串定義和標志粘貼
看看這兩個宏定義:
#define TRACE(X) cout<< #X << " = " << X << endl;
#define MEMBER(A) char* A##_string;int A##_size
第一條可以打印出任何一個表達式的值,第二條可以把兩個字符串合并成一個變量,看下面的例子:
#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;
}
運行結果是:
(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