使用宏需要注意的地方
宏仅是在预编译时,将用户的定义机械的展开。因此很容易出问题。
建议定义宏的时候,可以自己将宏展开一下。或者根据Effective C++里的建议,使用inline取而代之。
要为宏的所有实参加小括号
#define DOUBLE(NUM) \
(NUM * 2)
double num = 10.0;
double dbnum1 = DOUBLE(num + 1); // 结果是12.0
double dbnum2 = DOUBLE(1 + num); // 结果是21.0
// 正确的定义应该是
#define DOUBLE(NUM) \
((NUM) * 2)
// 或
template<class T>
inline T DOUBLE(T num)
{
return num * 2;
}
使用宏时注意实参出现的次数
使用宏时,避免使用实参++或–的情况。如:
// 例子一
#define IS_NUM(c) \
(((c) <= '9') && ((c) >= '0'))
// 计划打印0,1...,9,实际却打印“2,4,6,8,:”
unsigned char ascii = 0;
printf("ascii nums are = ");
while (ascii < 128) {
if (IS_NUM(ascii++))
printf("%c,", ascii);
}
// 例子二,参考Effective C++
#define FIND_MAX(a,b) \
((a) > (b) ? (a) : (b))
// 参数不同,a在执行后的值也不同
int a = 5, b = 0;
printf("%d\n", FIND_MAX(++a, b)); // 执行这句后,a已经等于7
a = 5;
printf("%d\n", FIND_MAX(++a, b + 10));// 执行这句后,a却等于6