这是我在学习OC的时候遇到的一个疑问
创建类Foo,这是练习全局变量和外部变量时候用的,文件中涉及外部变量 globalvar
#import <Foundation/Foundation.h> @interface Foo : NSObject -(void) setGlobalVar: (int) val; @end
#import "Foo.h" @implementation Foo -(void) setGlobalVar:(int)val { extern int globalvar; globalvar=val; } @end
然后是主程序,这是我接下来的程序,其中并没有加入头文件“Foo.h”
#import <Foundation/Foundation.h> #import "Fraction.h" int main(int argc, const char * argv[]) { @autoreleasepool { Fraction *fractionA,*fractionB,*fractionC; NSLog(@"%i",[Fraction countF]); fractionA=[[Fraction allocF] init]; fractionB=[[Fraction allocF] init]; fractionC=[[Fraction allocF] init]; NSLog(@"%i",[Fraction countF]); } return 0; }
Undefined symbols for architecture x86_64: "_globalvar", referenced from: -[Foo setGlobalVar:] in Foo.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
删掉类Foo或者去除语句
extern int globalvar; globalvar=val;后,程序不报错。
我的疑问是,为什么我主程序中没有引用类Foo,报错会出现在Foo的外部变量上呢?
我的理解应该是:既然我没有调用类Foo,那么他因该与我的主程序没有关联。为什么会引起报错?
希望大家给新手我指点下错误,谢谢!
extern是拿来宣告外部变数的,
你没有给它的一个全域变数
如果你的代码在加一行就不会报错了
#import"Foo.h"//宣告全域变数intglobalvar;@implementationFoo-(void)setGlobalVar:(int)val{externintglobalvar;globalvar=val;}@end版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。