Macro 小技巧 [C++ 求生筆記]
April 9, 2008 – 12:41 pm假如要寫出以下的Macro1:
1 2 3 4 | #define SWAP(a, b) \
temp = (a); \
(a) = (b); \
(b) = temp; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | float temp; float a = 10; float b = 20; // case 1 SWAP(a,b); // Correct. // case 2 if( a > 10) { SWAP(a,b); // (2) Correct too, } // case 3 if( b > 10) SWAP(a,b); // Fail !!! |
因為Case 3中的Macro,會被轉化為:
1 2 3 4 | if( b > 10) temp = (a); (a) = (b); (b) = temp;; |
這明顯不是我們想要的結果,所以就出現了這個小技巧:
1 2 3 4 5 6 | #define SWAP(a, b) \
do { \
temp = (a); \
(a) = (b); \
(b) = temp; \
} while(false) |
這樣定義SWAP這個Macro,問題就解決了,就算在Case 3的情況下,也會被轉化為:
1 2 3 4 5 6 7 8 | if( b > 10) do { temp = (a); (a) = (b); (b) = temp; } while(false); |
很簡單的小技巧,不過若不懂,就要想很久了:)
- 當然最好是用template,這個只是例子 ↩
2 Responses to “Macro 小技巧 [C++ 求生筆記]”
一定要有 do/while 嗎? 只用 {} 會怎樣?
By mtlung on Jul 9, 2008
只用{} ,在以下的情況,會有問題
if (sth)
SWAP(a, b); // 因為會變成 {…};
else
a++;
By rdescartes on Jul 9, 2008