2009-08-14 65 views
4

我在一个类的头文件中声明了一个NSString *数组。
PolygonShape.h当声明NSString *为全局外部数组时,Xcode中的错误和警告

NSString* POLYGON_NAMES[] = {@"Invalid Polygon", @"Monogon", ...}; 

现在我在PolyginShape.m使用如下这样:

- (NSString*) name { 
return (POLYGON_NAMES [self.numberOfSides]); 
} 

numberOfSides是伊娃这将表明在该多边形名称存储
所以指数非常好...它编译没有任何错误

然后,我在我的文件中添加了PolygonShape.h实现main方法(注意:这些没有任何类定义并调用函数C-Style比OBJ-C式)

#import "PolygonShape.h" 

现在,当我编译,我得到一个版本(连接)错误

ld: duplicate symbol _POLYGON_NAMES in /Users/../Projects/CS193P/1B/What_A_Tool/build/What_A_Tool.build/Debug/What_A_Tool.build/Objects-normal/i386/PolygonShape.o and /Users/../Projects/CS193P/1B/What_A_Tool/build/What_A_Tool.build/Debug/What_A_Tool.build/Objects-normal/i386/What_A_Tool.o 
collect2: ld returned 1 exit status 

于是我就直通堆栈溢出和其他论坛和主要建议是使全局变量extern和,所以我做...

extern NSString* POLYGON_NAMES[] = {@"Invalid Polygon", @"Monogon" .. }; 

但是我仍然得到链接错误,也越来越2个警告现在说

warning: 'POLYGON_NAMES' initialized and declared 'extern' 
在两个地方

我在哪里进口PolygonShape.h

缺少什么我在这里?

谢谢。

回答

9

在你的头文件声明数组为:

extern const NSString* POLYGON_NAMES[]; 

在源文件中,定义了阵列和初始化的内容:

const NSString* POLYGON_NAMES[] = {@"Invalid Polygon", @"Monogon" }; 
+0

那么在这种情况下不会对的“用户”类只是通过查看标题不知道数组POLYGON_NAMES []持有什么?这应该是一个类级别(以Java/C++术语来说是静态的)变量,所以不应该在头文件本身中提供给用户? – Dev 2009-08-14 05:34:30

+0

无法在C/C++/Objective C中的头文件中声明数组的内容。dmercredi是正确的,您需要在头文件中声明数组的存在(extern),并且实际的数组在执行中。否则,每次包含标题时都会声明一次数组(因此,您所遭遇的原始重复声明错误)。说“extern”意味着你声明,但不定义数组,所以它也没有意义初始化它,因此你在第二次尝试时遭受的警告。 – 2009-08-14 06:17:17

+0

谢谢dmercredi和彼得 – Dev 2009-08-14 09:30:54