首頁  >  問答  >  主體

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只被递增一次!!

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

高洛峰高洛峰2714 天前549

全部回覆(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
  • 取消回覆