当我发现一些有趣的代码时,我正在阅读绕过objective-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
我的问题是;当使用c函数时,在一个objective-c对象中,c函数(在这种特殊情况下是cFibIMP)放在哪个范围内? objective-c类是否封装了删除name-clash更改的c函数,或者是将c函数简单地转储到整个objective-c程序的全局范围内?
答案 0 :(得分:4)
这些函数被转储到“全局”范围内。
您可以通过在示例代码的末尾添加一个新类来检查:
@interface Gib : NSObject {}
@end
@implementation Gib
- (void) t
{
NSLog(@"%d", cFibIMP(10));
}
@end
答案 1 :(得分:1)
C函数具有全局范围。
如果你想拥有类“范围”这样的东西,最好的办法就是使用static
关键字,它将函数的范围限制在包含它的源文件中。对于你在这里说明的那种用法,这通常足够接近。