Objective-C全局整数数组未按预期工作

时间:2010-05-12 01:07:38

标签: c objective-c arrays global-variables extern

在我的MyConstants.h文件中......我有:

int abc[3];

在我匹配的MyConstants.m文件中......我有:

extern int abc[3] = {11, 22, 33};

在我的其他* .m文件中......我有

#import "MyConstants.h"

在我的viewDidLoad {}方法中,我有:

extern int abc[];
NSLog(@"abc = (%d) (%d)", abc[1], sizeof(abc)/sizeof(int));  

为什么显示“abc =(0)(3)”而不是“abc =(22)(3)”?

如何按预期进行此项工作?

1 个答案:

答案 0 :(得分:5)

extern需要位于标头中的声明中,而不是源文件中的定义中。 extern告诉编译器符号存在于其他地方,它可能在同一个翻译单元中,也可能不在同一个翻译单元中。链接器的工作是确保所有声明的符号都已实际定义。

常量标题(MyConstants.h):

extern int abc[3];

常量来源(MyConstants.m):

int abc[3] = {11, 22, 33};

其他来源(SomeFile.m):

#include "MyConstants.h"
...
- (void) someMethod
{
    NSLog (@"abc = (%d) (%d)", abc[1], sizeof(abc)/sizeof(int));
}

另外,请注意,在测量数组的大小时,它更不容易出错,除以第一个元素的大小,因此如果abc的类型发生变化(即来自int }到double),结果仍然有效。

- (void) someMethod
{
    NSLog(@"abc = (%d) (%d)", abc[1], sizeof(abc)/sizeof(abc[0]));
}