在我的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)”?
如何按预期进行此项工作?
答案 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]));
}