2010-03-20 7 views
5

Stavo leggendo su circa bypassando messaggistica di Objective-C per ottenere prestazioni (irrilevante per questa specifica questione) quando ho trovato un po 'interessante di codice:Qual è l'ambito di una funzione c definita all'interno della classe obiettivo-c?

#import <Cocoa/Cocoa.h> 

@interface Fib : NSObject { } 

- (long long) cFib: (NSUInteger) number; 

@end 

@implementation Fib 

// c implementation of fib 
long long cFibIMP(NSUInteger number) 
{ 
    return (number < 3) ? 1 : cFib(number - 1) + cFib(number - 2); 
} 

// method wrapper for c implementation of fib 
- (long long) cFib: (NSUInteger) number 
{ 
    return cFibIMP(number); 
} 

@end 

La mia domanda è; quando si usa la funzione c, all'interno di un oggetto obiettivo-c, in quale ambito si trova la funzione c (cFibIMP in questo caso particolare)? La classe dell'obiettivo-c incapsula la funzione c rimuovendo il cambiamento del nome-scontro o la funzione c è semplicemente scaricata nello scopo globale dell'intero programma obiettivo-c?

risposta

4

Le funzioni vengono scaricate nell'ambito "globale".

È possibile controllare questo con l'aggiunta di una nuova classe alla fine del vostro codice di esempio:

@interface Gib : NSObject {} 
@end 
@implementation Gib 
- (void) t 
{ 
    NSLog(@"%d", cFibIMP(10)); 
} 
@end 
1

La C funzione ha ambito globale.

Se si desidera avere qualcosa come "classe", la soluzione migliore è probabilmente quella di utilizzare la parola chiave static, che limita l'ambito della funzione al file di origine in cui è contenuto. Per il tipo di utilizzo che stai illustrando qui, di solito è abbastanza vicino.

+0

quindi la preposizione statica della dichiarazione di funzione limiterebbe quindi l'ambito al modulo? Questo vale anche se la dichiarazione statica è resa interna alla @implementation anziché essere resa esterna (vale a dire all'inizio del file del codice sorgente?) –

Problemi correlati