0

次のマクロがあります。

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

私がそれを呼び出そうとすると:

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

エラーが発生します:

"Excepted ";" at end of declaration"

なんで?

4

3 に答える 3

7

if表現ではなく、ステートメントです。returnそんな価値はあり得ない。

あなたはおそらく次のことを意味します:

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

右側の引数を囲む余分な括弧は一般的であり、予期しない優先度関連のインシデントから保護するためにあります。

また、上記はテキスト置換を行うことによって前処理されているため、おそらく同等の関数よりも多くのオブジェクトが構築されることに注意してください。

于 2012-07-04T12:40:03.333 に答える
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))
于 2012-07-04T12:41:21.207 に答える
0

returnステートメントを使用する必要はありません...次のコードを使用してみてください

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

これはあなたを助けるかもしれません..

于 2012-07-04T12:44:31.563 に答える