2010-03-20 20 views
5

我读了关于绕过Objective-C的消息,以获得性能(不相干的这个具体问题),当我发现的代码有趣的一点:在Objective-C类中定义的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类是否封装了c函数来消除名称冲突的变化,还是仅仅将c函数转储到整个objective-c程序的全局范围中?

回答

4

这些函数被倾倒在“全局”范围内。

您可以在您的示例代码末尾添加一个新的类检查:

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

C函数具有全局范围。

如果你想有类似“范围”的范围,最好的办法可能是使用static关键字,它将函数的作用域限制在它所包含的源文件中。对于你在这里举例说明的用法,这通常足够接近。

+0

所以对函数声明的静态前置将会限制它的范围到模块呢?这是否适用,即使该静态声明是在@implementation内部进行的,而不是在外部进行(即在源代码文件的开头?) – 2010-03-20 17:36:46

相关问题