2
#define CLog( s, ... ) NSLog( @"%@", [NSString stringWithFormat:(s), ##__VA_ARGS__] )
#define PO(x) CLog(@#x ": %@", x)

それから私は:

 NSString * hello =[NSString stringWithFormat:@"%@, %@",theCatalogData.id,@(theCatalogData.images.count)];
    PO(hello);

作品

もちろん、これの短縮版は次のとおりです。

PO([NSString stringWithFormat:@"%@, %@",theCatalogData.id,@(theCatalogData.images.count)]);

それはうまくいきません。なぜだろう。

緊急事態はありません。問題ない。いずれにせよ、同等の長い方が機能します。コンパイラがマクロを解析して、なぜうまくいかないのかを理解したいだけです。

4

1 に答える 1

7

プリプロセッサ自体は構文を実際には理解していないため、コンマを含むマクロ パラメータは問題を引き起こします。

2 番目のケースでは、パラメーターに引用符の外側に 2 つのコンマが含まれているため、コンパイラーは、マクロが 1 つではなく 3 つのパラメーターを取得していると見なし、マクロがパラメーターを 1 つしかとらないため、コンパイラーはエラーを出します。

2 番目のケースに似た単純化されたテスト ケース。

#define TEST(a,b,c) a
TEST([d e:@"%@, %@", f, g])

に展開されます。

[d e:@"%@, %@"

これは、aパラメーターに最初の引用符で囲まれていないコンマまでのすべての文字のみが含まれていることを示しています。

あなたの場合、TEST マクロを1 つのパラメータを取るように定義すると、プリプロセッサはそれを 3 と見なすため、コンパイルは失敗します。

于 2013-01-01T07:48:54.290 に答える