在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