Я читал об обходе цели-c's, обменивающейся сообщениями для получения производительности (не важный этому конкретному вопросу), когда я нашел интересный бит кода:
#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
Мой вопрос; при использовании c функции, в объективном-c объекте, во что объемом является функция c (cFibIMP в данном случае) помещенный? Объективный-c класс инкапсулирует функцию c, удаление столкновения изменения названия или функции c просто выводится в глобальную область видимости целой объективной-c программы?
Функции выгружаются в «глобальную» область видимости.
Вы можете проверить это, добавив новый класс в конец вашего примера кода:
@interface Gib : NSObject {}
@end
@implementation Gib
- (void) t
{
NSLog(@"%d", cFibIMP(10));
}
@end
Функция C имеет глобальную область видимости.
Если вы хотите иметь что-то вроде области видимости "класса", лучше всего, вероятно, использовать ключевое слово static
, которое ограничивает область действия функции исходным файлом, в котором она содержится. Для того типа использования, который вы здесь иллюстрируете, этого обычно достаточно.