zoukankan      html  css  js  c++  java
  • 宏的副作用

    宏定义在实际使用中如果不稍加注意,如果表达式有副作用,就可能导致返回的结果跟预期不符。下面是几种常见的问题:

    输入输出

    #define MULTI(a,b) a * b
    MULTI(1+2,3);// => 1 + 2 * 3
    
    
    #define ADD(a,b) (a) + (b)
    int c = ADD(1,2) * 3; //1 + 2 * 3
    

    因此宏的参数和返回值最好是用()扩起来

    #define MULTI(a,b) ((a) * (b))
    #define ADD(a,b) ((a) + (b))
    

    自增自减运算

    #define MAX(a,b) ((a) > (b) ? (a) : (b))
    int a = 3,b = 2;
    int c = MAX(a++,b);
    

    返回值预期是4(a++)实际上是5,a进行了两次++运算。
    所以一般使用宏最好不要传入自增自减。

    实际使用参数和宏内部变量同名

    #define HASH(str, sz, rst)  
        do                      
        {                       
            unsigned int n = 0; 
            n = xxx;            
            rst = n % sz;       
        } while (0)
    

    这是一个hash的宏实现,其中定义了一个临时变量n,根据str计算n,然后对sz求模并把返回值赋给传进来的rst.
    这么调用:

    int n;
    HASH("hello",7,n);
    

    不会达到改变n的效果,因为实际使用参数n和宏内部的变量n同名。解决办法是宏内部变量使用一种不同风格的命名方式。

    #define HASH(str, sz, rst)  
        do                      
        {                       
            unsigned int _n = 0; 
            _n = xxx;            
            rst = _n % sz;       
        } while (0)
    
  • 相关阅读:
    KMP算法精髓
    习题
    JavaScript function函数种类介绍
    街景地图 API
    电脑网卡
    框架的设计之IRepository还是IRepository<T>
    顺序线性表
    hdu4284之字典树
    pt-table-checksum
    C++中输入输出流及文件流操作笔记
  • 原文地址:https://www.cnblogs.com/lkpp/p/c_macro.html
Copyright © 2011-2022 走看看