3

次のコードがコンパイルされます。

^{}();

そして、これはコンパイルされます:

void (^x)();
(x = ^{})();

しかし、これはしません:

(void (^x)() = ^{})();

私が得るエラーはですExpected ')'。これはllvmか何かのバグですか?Objective-C が JavaScript であるというふりをするのを完全に妨げています。

4

2 に答える 2

6

これは、C ライクな言語では意味がありません。その理由を確認するために、ステートメントをゼロから作成してみましょう。

まず、次の作業宣言を使用しますx

void (^x)();

次に、同じステートメントで初期化しましょう。

void (^x)() = ^{};

これまでのところx、正しいブロックで初期化されています。それでは、今すぐ呼び出しましょうx。しかし、どこに()行きますか?当然、()ブロック値式の直後に を配置する必要があります。ただし、C では、宣言はステートメントであり、式ではないため、

(void (^x)() = ^{})();

意味がありません。が移動できる唯一の場所()は、 の後にあり^{}ます。

void (^x)() = ^{}();

しかし、 ^{}()typevoidではなく typeを持っていvoid (^)()ます。

要約すると、ブロック変数を宣言して同時に呼び出すことはできません。変数を宣言して初期化してから呼び出す必要があります

void (^x)() = ^{};
x();

またはそれを宣言してから割り当てて呼び出します

void (^x)();
(x = ^{})();

または、3 つすべてを分離するだけです。

void (^x)();
x = ^{};
x();

結論として、ブロックの宣言と呼び出しを同時に行うことが望ましいとしましょう。のようなコードを許可することにした場合、一貫性のために、または(void (^x)() = ^{})();などのコードも許可する必要があります。これらが C では奇妙に見えることに同意していただければ幸いです。++(void x = 4);(void x = 1) + (void y = 2);

于 2012-08-19T05:13:08.427 に答える
3

類推として、次のことを考慮してください。

これはコンパイルされます:

if (42) { }

そして、これはコンパイルされます:

int x;
if (x = 42) { }

しかし、これはしません:

if (int x = 42) { }
于 2012-08-19T08:48:46.657 に答える