2010-03-20 7 views
5

Czytałam się o pominięciem wiadomości Objective-C, aby uzyskać wydajność (nieistotne dla tej konkretnej kwestii), kiedy znalazłem ciekawy kawałek kodu:Jaki jest zakres funkcji c zdefiniowanej w ramach klasy cel-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 

moje pytanie brzmi; przy korzystaniu z funkcji c, w ramach obiektu cel c, w jakim zakresie jest umieszczona funkcja c (cFibIMP w tym konkretnym przypadku)? Czy klasa "cel-c" zawiera funkcję c usuwającą zmianę nazwy-clash, czy też funkcja c jest po prostu wrzucona do globalnego zasięgu całego programu target-c?

Odpowiedz

4

Funkcje są zrzucane w zakresie "globalnym".

Można to sprawdzić poprzez dodanie nowej klasy na koniec swojej przykładowy kod:

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

C funkcja ma zasięg globalny.

Jeśli chcesz mieć coś w rodzaju "klasy", najlepiej jest użyć słowa kluczowego static, które ogranicza zakres funkcji do pliku źródłowego, w którym jest zawarty. W przypadku tego rodzaju użycia, które tu ilustrujesz, zwykle jest wystarczająco blisko.

+0

, więc dodanie statycznego do deklaracji funkcji ograniczyłoby jego zakres do modułu? Czy ma to zastosowanie nawet wtedy, gdy ta statyczna deklaracja jest wprowadzana wewnętrznie do @ implementacji, a nie na zewnątrz (tj. Na początku pliku kodu źródłowego?) –

Powiązane problemy