2010-03-20 14 views
5

que estaba leyendo acerca de hasta pasar por la mensajería de Objective-C para obtener un rendimiento (irrelevante para esta pregunta específica) cuando me encontré un poco interesante de código:¿Cuál es el alcance de una función c definida dentro de la clase objetivo-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 

Mi pregunta es; cuando se utiliza la función c, dentro de un objeto objetivo-c, ¿en qué ámbito se ubica la función c (cFibIMP en este caso particular)? ¿La clase objetivo-c encapsula la función c eliminando el cambio del choque de nombres o la función c simplemente se vierte en el alcance global de todo el programa objetivo-c?

Respuesta

4

Las funciones se vuelcan en el ámbito "global".

Esto se puede comprobar mediante la adición de una nueva clase al final de su código de ejemplo:

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

La función de C tiene un alcance global.

Si desea tener algo como alcance de "clase", su mejor opción es utilizar la palabra clave static, que limita el alcance de la función al archivo fuente en el que está contenida. Para el tipo de uso que estás ilustrando aquí, eso suele ser lo suficientemente cercano.

+0

por lo que anteponer declaración estática a la función restringiría su alcance al módulo, entonces? ¿Esto se aplica a pesar de que la declaración estática se realiza internamente a @implementation en lugar de externa (es decir, al comienzo del archivo de código fuente?) –

Cuestiones relacionadas