Я вижу что-то странное, когда я запускаю код, который использует ключевое слово 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);
}
Когда я использую Экстерн ключевое слово в моих методах, код работает правильно и приводит к целому числу 3 печати. Однако, когда я удаляю extern, целое число 2 печатается. Почему это? Поскольку gCounter - статическая переменная, не должно ли это работать без ключевого слова extern?
Когда вы удаляете extern, удаляете ли вы всю декларацию или вы оставляете ее как 'int gCounter'? –
@HotLicks Я оставляю его как int gCounter. – Brosef
Избавьтесь от всех строк 'extern in gCounter;'. Вы не хотите их, если ваша цель - ссылаться на статический 'gCounter'. – rmaddy