开发者社区> 问答> 正文

主程序中没有引用类,在程序运行时却显示错误出现在类文件中

这是我在学习OC的时候遇到的一个疑问

创建类Foo,这是练习全局变量和外部变量时候用的,文件中涉及外部变量 globalvar

import

@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

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,那么他因该与我的主程序没有关联。为什么会引起报错?

希望大家给新手我指点下错误,谢谢!

展开
收起
杨冬芳 2016-06-27 17:10:00 2197 0
1 条回答
写回答
取消 提交回答
  • IT从业

    extern是拿来宣告外部变数的,

    你没有给它的一个全域变数

    如果你的代码在加一行就不会报错了

    import "Foo.h"

    //宣告全域变数
    int globalvar;

    @implementation Foo
    -(void) setGlobalVar:(int)val
    {

    extern int globalvar;
    globalvar=val;

    }
    @end

    2019-07-17 19:47:51
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
15分钟打造你自己的小程序 立即下载
小程序 大世界 立即下载
《15分钟打造你自己的小程序》 立即下载