编码踩过的坑(宏)

使用宏需要注意的地方

宏仅是在预编译时,将用户的定义机械的展开。因此很容易出问题。
建议定义宏的时候,可以自己将宏展开一下。或者根据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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值