當我運行一些使用extern關鍵字引用實現文件中的靜態變量的代碼時,我看到了一些奇怪的東西。所以我在我的實現文件中聲明瞭靜態變量gCounter,並在同一個實現文件中的兩個方法中引用它(因爲它的靜態方法)。但是,當我在我的方法中使用extern關鍵字時,我得到了不同的結果。我的理解(從閱讀我的書)是,當您引用與您的方法相同的文件中聲明的靜態變量時,extern不是必需的。代碼如下:使用extern獲得靜態變量
/**接口**/
#import <Foundation/Foundation.h>
@interface Fraction : NSObject
+(Fraction *) allocF;
+(int) count;
@end
/**implementation**/
#import "Fraction.h"
static int gCounter;
@implementation Fraction
+(Fraction *) allocF
{
extern int gCounter;
++gCounter;
return [Fraction alloc];
}
+(int)count
{
extern int gCounter;
return gCounter;
}
@end
/**main**/
#import "Fraction.h"
int main (int argc, const char * argv[])
{
@autoreleasepool
{
Fraction *a, *b, *c;
NSLog(@"The number of fractions allocated: %i", [Fraction count]);
a = [[Fraction allocF] init];
b = [[Fraction allocF] init];
c = [[Fraction allocF] init];
NSLog(@"The number of fractions allocated: %i", [Fraction count]);
}
return(0);
}
當我使用extern關鍵字在我的方法中,所述代碼工作正常,並且導致整數3進行打印。但是,當我刪除extern時,整數2被打印。這是爲什麼?由於gCounter是一個靜態變量,這不應該沒有extern關鍵字?
當你刪除extern時,你是否刪除了整個聲明,還是把它作爲'int gCounter'? –
@HotLicks我把它作爲int gCounter。 – Brosef
擺脫gCounter;'行中的整個'extern。如果你的目標是引用靜態的'gCounter',你不需要它們。 – rmaddy