2013-07-03 13 views
6

Utilizzando apple's example dalla documentazioneerrore di sintassi di blocco da esempio di Apple 'Creazione di un blocco'

float (^oneFrom)(float); 


oneFrom = ^(float aFloat) { 

    float result = aFloat - 1.0; 

    return result; 

}; 

ottengo due errori:

  1. Ridefinizione di 'oneFrom' con un diverso tipo: 'int' vs 'float (^) (float)'
  2. indicatore di tipo mancante, il default è 'int'

Als o dal doc ..

Se non si dichiara esplicitamente il valore di ritorno di un'espressione blocco , si può dedurre automaticamente dal contenuto del blocco . Se il tipo di reso è inferito e l'elenco dei parametri è nullo, , puoi anche omettere l'elenco dei parametri (void). Se o quando dichiarazioni di reso multiple sono presenti, devono corrispondere esattamente (utilizzando la fusione se necessario).

risposta

3

Non è possibile definire blocchi sullo scope del file, solo nelle funzioni. Funziona come previsto:

void foo (void) 
{ 
    float (^oneFrom)(float); 
    oneFrom = ^(float aFloat) { 
     float result = aFloat - 1.0; 
     return result; 
    }; 
} 
+0

La mia comprensione era che i blocchi sono simili ai puntatori di funzione C. Non dovrei essere in grado di dichiararlo nel file di intestazione? – estobbart

+0

@estobbart No, i blocchi sono un concetto molto più complesso dei puntatori di funzione. Più importante: trasportano i dati, quindi devono essere allocati dinamicamente nello stack o nell'heap. C non consente l'inizializzazione di oggetti con durata di archiviazione statica, quindi non è possibile definire un blocco sull'ambito del file. –

+0

@estobbart È possibile, ovviamente, dichiarare una variabile di tipo blocco utilizzando 'extern' in un file di intestazione. Non è possibile definire un blocco, però. –

-1

che bloccano non ha una tipo di ritorno, e il tipo di ritorno di default è vuoto, è necessario andare

float (^oneFrom)(float); 

oneFrom =^float (float aFloat) { 

    float result = aFloat - 1.0; 

    return result; 

}; 

here è un esempio migliore blocchi

+0

Questo esempio riporta ancora gli stessi errori. Mi manca qualcosa di ovvio? – estobbart

+0

No. Il blocco ha un tipo di ritorno che viene dedotto dall'effettiva istruzione 'return'. Ha il tipo corretto di 'float'. –

+0

ah, sì il mio errore, l'ho sempre implicitamente fatto per qualche motivo. la tua risposta è probabilmente la vera soluzione anche qui, non pensavo a dove sarebbe stato definito il blocco – Fonix

Problemi correlati