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);

很簡單的小技巧,不過若不懂,就要想很久了:)

  1. 當然最好是用template,這個只是例子
  1. 2 Responses to “Macro 小技巧 [C++ 求生筆記]”

  2. 一定要有 do/while 嗎? 只用 {} 會怎樣?

    By mtlung on Jul 9, 2008

  3. 只用{} ,在以下的情況,會有問題

    if (sth)
    SWAP(a, b); // 因為會變成 {…};
    else
    a++;

    By rdescartes on Jul 9, 2008

Post a Comment