c++宏定义问题
高洛峰
高洛峰 2017-04-17 13:04:46
0
6
607

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

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

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

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回覆(6)
黄舟

首先,你要明白,define就是進行簡單的替換,這是第一點,基於此,我們就將你提供的兩個表達式使用巨集來進行替換,然後你就會明白了。

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

你再把值填進去計算,你就應該明白了。

先判斷a是否大於b,此時會進行一次++運算運算;當a大於b時,會傳回++a表達式,會再進行一次++運算;我說的比較繞,我想你應該懂我的意思。

解決方案就是,不要在巨集中使用會改變自己值的運算符,例如++,--等,這樣會讓你很暈的。

Peter_Zhu

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; }) 
阿神

分開寫唄 顯然宏定義的時候就沒有考慮過副作用

迷茫

@brayden 的方法是沒有用的,因為這不是標準C/C++的語法

我不知道你為什麼一定要用宏,因為你說你用的是C++,顯然應該用模板函數來解決這個問題:

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

當然了,C++早就考慮過這個問題了,所以你有std::max可以用。

巴扎黑

你得好好學學基礎文法。條件式的執行邏輯要搞清楚

黄舟

模板棒棒噠,同學你這個是Effective c++的程式碼哈哈哈,我也在看,可以互相討論哦

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板