编码踩过的坑(宏)

来源:互联网 发布:linux教程xwindows 编辑:程序博客网 时间:2024/06/04 00:37

使用宏需要注意的地方

宏仅是在预编译时,将用户的定义机械的展开。因此很容易出问题。
建议定义宏的时候,可以自己将宏展开一下。或者根据Effective C++里的建议,使用inline取而代之。

要为宏的所有实参加小括号

#define DOUBLE(NUM) \    (NUM * 2)double num = 10.0;double dbnum1 = DOUBLE(num + 1); // 结果是12.0double 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
原创粉丝点击