Mit apple's example aus der DokumentationBlock-Syntaxfehler von Apple Beispiel 'Erstellen eines Block'
float (^oneFrom)(float);
oneFrom = ^(float aFloat) {
float result = aFloat - 1.0;
return result;
};
ich zwei Fehler:
- Neudefinition von 'oneFrom' mit einem anderen Typ: 'int' vs 'Schwimmer (^) (float)'
- Typspezifizierer fehlt, ist standardmäßig 'int'
Als o vom doc ..
Wenn Sie den Rückgabewert eines Blocks Ausdruck nicht explizit deklarieren, kann er automatisch aus dem Inhalt des Block geschlossen werden. Wenn der Rückgabetyp abgeleitet ist und die Parameterliste ungültig ist, können Sie auch die Parameterliste (void) weglassen. Wenn oder wenn mehrere Rücksendeanweisungen vorhanden sind, müssen sie genau übereinstimmen (unter Verwendung von Casting, falls erforderlich).
Mein Verständnis war, dass Blöcke C-Funktionszeiger ähnlich sind. Kann ich das nicht in der Header-Datei deklarieren? – estobbart
@estobbart Nein, Blöcke sind ein viel komplexeres Konzept als Funktionszeiger. Am wichtigsten: Sie tragen Daten, also müssen sie dynamisch auf dem Stapel oder Haufen verteilt werden. C erlaubt keine Initialisierung von Objekten mit statischer Speicherdauer, sodass Sie keinen Block für den Dateibereich definieren können. –
@estobbart Sie können natürlich eine Blocktypvariable mit 'extern' in einer Header-Datei deklarieren. Sie können jedoch keinen Block definieren. –