検索

ホームページ  >  に質問  >  本文

c++宏定义问题

我以前写过这样的宏替换代码:

#define MAX(a, b) ((a) > (b) ? (a):(b)) //得到两个数中的最大值

在每个变量外都加了括号以后,使用起来确实没碰到过什么问题。可是作者这样使用 这个函数:

int a = 5, b = 0;
MAX(++a, b); //a会被递增两次
MAX(++a, b+10); //由于b+10>a,a只被递增一次!!

问:问题产生原因?解决方案?

高洛峰高洛峰2803日前603

全員に返信(6)返信します

  • 黄舟

    黄舟2017-04-17 13:06:46

    首先,你要明白,define就是进行简单的替换,这是第一点,基于此,我们就将你提供的两个表达式使用宏来进行替换,然后你就会明白了。

    ((a) > (b) ? (a) : (b)) =>  ((++a) > (b) ? (++a) : (b))
    ((a) > (b) ? (a) : (b)) =>  ((++a) > (b+10) ? (++a) : (b+10))
    

    你再把值填进去计算,你就应该明白了。

    先判断a是否大于b,此时会进行一次++运算操作;当a大于b时,会返回++a表达式,会再次进行一次++操作;我说的比较绕,我想你应该懂我的意思。

    解决方案就是,不要在宏中使用会改变自己值的运算符,比如++,--等,这样会让你很晕的。

    返事
    0
  • 天蓬老师

    天蓬老师2017-04-17 13:06:46

    http://www.cnblogs.com/safeking/archive/2008/03/21/1116302.html

    去掉副作用的最小宏定义方式(linux kernel定义)

    159: #define min_t(type,x,y) \
    160:         ({ type __x = (x); type __y = (y); __x < __y ? __x: __y; }) 

    返事
    0
  • 阿神

    阿神2017-04-17 13:06:46

    分开写呗 显然宏定义的时候就没有考虑过副作用

    返事
    0
  • 迷茫

    迷茫2017-04-17 13:06:46

    @brayden 的方法是没有用的,因为这不是标准C/C++的语法

    我不知道你为什么一定要用宏,因为你说你用的是C++,显然应该使用模板函数来解决这个问题:

    template<typename T>
    T Max(T a, T b)
    {
        return a > b ? a : b;
    }

    当然了,C++早就考虑过这个问题了,所以你有std::max可以用。

    返事
    0
  • 巴扎黑

    巴扎黑2017-04-17 13:06:46

    你得好好学学基础语法。条件表达式的执行逻辑要搞清

    返事
    0
  • 黄舟

    黄舟2017-04-17 13:06:46

    模板棒棒哒,同学你这个是Effective c++的代码哈哈哈,我也在看,可以相互讨论哦

    返事
    0
  • キャンセル返事