2012-07-04 31 views
0

我有以下宏:調用宏

#define testMethod(a, b) \ 
     if (a.length > b.length) \ 
      return a; \ 
     return b; 

當我嘗試把它稱爲:

NSString *s = testMethod(@"fir", @"sec"); 

我得到一個錯誤:

"Excepted ";" at end of declaration"

爲什麼?

回答

7

if是一個語句,而不是一個表達式。它不能return這樣的值。

你大概的意思是:

#define testMethod(a, b) ((a).length > (b).length ? (a) : (b)) 

圍繞右側的參數的額外括號,是常見的,在那裏保護您免受意外precendence相關的事件。

另請注意,因爲上述是通過文本替換進行預處理的,所以它可能會構建比等效函數更多的對象。

+0

謝謝工作很好。 – Shamsiddin

3

如果你想在表達式中使用宏,它應該被定義爲一個表達式本身,而不是一組語句。最終會出現語法錯誤,因爲該宏被逐字替換,並且在另一個語句中不允許使用語句。

GCC有一個名爲「語句表達」,可以幫助你實現這一目標的延伸,但它是非標準:

#define testMethod(a, b) ({ \ 
    typeof(a) result = (a).length > (b).length ? (a) : (b); \ 
    result; \ 
}) 

其實,在需要的這種你的情況沒有因爲報表可以很容易地轉換爲表達式:

#define testMethod(a, b) ((a).length > (b).length ? (a) : (b)) 
+0

+1,但是會有一個更好的變體:通過使用gcc的'typeof'擴展名,你可以先評估'a'和'b',然後在'})'' 。 –

0

你不需要使用return語句...嘗試使用下面的代碼

#define testMethod(a,b) ((a) < (b) ? (a) : (b)) 

可能這會幫你..