【问题标题】:How to use extern keyword to define global ivars in IOS? [duplicate]IOS中如何使用extern关键字定义全局变量? [复制]
【发布时间】:2015-11-24 01:35:14
【问题描述】:

如何使用 extern 关键字定义全局 ivars,有人知道这个问题吗?提前谢谢。

来自 cmets 的更新:

好的,我从网上搜索到我应该在.h文件中声明变量,如下所示,

int name;
@interface testGlobal : NSObject
@end

当我想在一个 .m 文件中使用它时,我应该像下面这样写,

extern int name;
@implementation ViewController

当我在实现文件中使用它时,我得到了以下错误

重复的符号 _name 在: /Users/jay_Gao/Library/Developer/Xcode/DerivedData/Audition-bahpwhcmpnzxppajcliyuhtuaywz/Build/Intermediates/Audition.build/Debug-iphonesimulator/Audition.build/Objects-normal/x86_64/Test.o /Users/jay_Gao/Library/Developer/Xcode/DerivedData/Audition-bahpwhcmpnzxppajcliyuhtuaywz/Build/Intermediates/Audition.build/Debug-iphonesimulator/Audition.build/Objects-normal/x86_64/testGlobal.o ld:架构 x86_64 的 1 个重复符号 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)' , 你能解释一下吗? – 我通过删除成功构建 #import "testGlobal.h" 来自 test.m。但是如果我想在其他文件中导入那个文件testGlobal.h,我不能这样做吗?我应该只在AppDelegate.h 中声明全局变量吗?因为在其他文件上会导入AppDelegate.h?

我从我这边测试它,我可以成功构建它,但我感到困惑,为什么要以这种方式声明全局变量。该变量在任何代码块之外。

【问题讨论】:

  • 先了解什么是ivar。
  • ivar 是一个变量,它不同于属性
  • 没有。 ivar 是"instance variable" 的缩写。注意“实例”,这意味着某物的实例,全局意味着不是任何东西的实例。顺便说一句,这些天你需要指定一种语言,标签是这样做的好地方。
  • 您在其他地方声明了name。完整的错误信息总是比它的一部分好,用它来更新问题。
  • 如果您在头文件 (.h) 文件中定义变量,它最终会在导入头文件的每个实现文件 (.m) 中声明。本质上,头文件被复制到替换#include/#import的文件中。这就是为什么会有重复的错误消息。正如@psobko 演示的那样,标头中的 extern 在 one 实现文件中声明。

标签: ios objective-c global


【解决方案1】:

你需要在接口中extern它并在你的testGlobal类的实现中声明:

//Global.h
extern int xyz;

@interface Global : NSObject
@end

//Global.m
#import "Global.h"

int xyz = 123;
@implementation Global
@end

//ViewController.m
#import "ViewController.h"
#import "Global.h"

@implementation ViewController

- (void)viewDidLoad {
    NSLog(@"%d", xyz);
    [super viewDidLoad];
}

【讨论】:

    猜你喜欢
    • 2012-06-22
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多