【发布时间】: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