我以前写过这样的宏替换代码:
#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教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
首先,你要明白,define就是進行簡單的替換,這是第一點,基於此,我們就將你提供的兩個表達式使用巨集來進行替換,然後你就會明白了。
((a) > (b) ? (a) : (b)) => ((++a) > (b) ? (++a) : (b)) ((a) > (b) ? (a) : (b)) => ((++a) > (b+10) ? (++a) : (b+10))
你再把值填進去計算,你就應該明白了。
先判斷a是否大於b,此時會進行一次++運算運算;當a大於b時,會傳回++a表達式,會再進行一次++運算;我說的比較繞,我想你應該懂我的意思。
解決方案就是,不要在巨集中使用會改變自己值的運算符,例如++,--等,這樣會讓你很暈的。
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++的程式碼哈哈哈,我也在看,可以互相討論哦
首先,你要明白,define就是進行簡單的替換,這是第一點,基於此,我們就將你提供的兩個表達式使用巨集來進行替換,然後你就會明白了。
你再把值填進去計算,你就應該明白了。
先判斷a是否大於b,此時會進行一次++運算運算;當a大於b時,會傳回++a表達式,會再進行一次++運算;我說的比較繞,我想你應該懂我的意思。
解決方案就是,不要在巨集中使用會改變自己值的運算符,例如++,--等,這樣會讓你很暈的。
http://www.cnblogs.com/safeking/archive/2008/03/21/1116302.html
去掉副作用的最小巨集定義方式(linux kernel定義)
分開寫唄 顯然宏定義的時候就沒有考慮過副作用
@brayden 的方法是沒有用的,因為這不是標準C/C++的語法
我不知道你為什麼一定要用宏,因為你說你用的是C++,顯然應該用模板函數來解決這個問題:
當然了,C++早就考慮過這個問題了,所以你有std::max可以用。
你得好好學學基礎文法。條件式的執行邏輯要搞清楚
模板棒棒噠,同學你這個是Effective c++的程式碼哈哈哈,我也在看,可以互相討論哦