次のマクロがあります。
#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))
右側の引数を囲む余分な括弧は一般的であり、予期しない優先度関連のインシデントから保護するためにあります。
また、上記はテキスト置換を行うことによって前処理されているため、おそらく同等の関数よりも多くのオブジェクトが構築されることに注意してください。
式内でマクロを使用する場合は、ステートメントのグループとしてではなく、式自体として定義する必要があります。マクロが文字どおりに置換され、別のステートメント内でステートメントを使用できないため、構文エラーが発生します。
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))
returnステートメントを使用する必要はありません...次のコードを使用してみてください
#define testMethod(a,b) ((a) < (b) ? (a) : (b))
これはあなたを助けるかもしれません..