我有以下宏:調用宏
#define testMethod(a, b) \
if (a.length > b.length) \
return a; \
return b;
當我嘗試把它稱爲:
NSString *s = testMethod(@"fir", @"sec");
我得到一個錯誤:
"Excepted ";" at end of declaration"
爲什麼?
我有以下宏:調用宏
#define testMethod(a, b) \
if (a.length > b.length) \
return a; \
return b;
當我嘗試把它稱爲:
NSString *s = testMethod(@"fir", @"sec");
我得到一個錯誤:
"Excepted ";" at end of declaration"
爲什麼?
if
是一個語句,而不是一個表達式。它不能return
這樣的值。
你大概的意思是:
#define testMethod(a, b) ((a).length > (b).length ? (a) : (b))
圍繞右側的參數的額外括號,是常見的,在那裏保護您免受意外precendence相關的事件。
另請注意,因爲上述是通過文本替換進行預處理的,所以它可能會構建比等效函數更多的對象。
如果你想在表達式中使用宏,它應該被定義爲一個表達式本身,而不是一組語句。最終會出現語法錯誤,因爲該宏被逐字替換,並且在另一個語句中不允許使用語句。
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))
+1,但是會有一個更好的變體:通過使用gcc的'typeof'擴展名,你可以先評估'a'和'b',然後在'})'' 。 –
你不需要使用return語句...嘗試使用下面的代碼
#define testMethod(a,b) ((a) < (b) ? (a) : (b))
可能這會幫你..
謝謝工作很好。 – Shamsiddin