在我的 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)”?
如何使这项工作按预期进行?
最佳答案
extern
需要位于 header 的声明中,而不是位于源文件的定义中。 extern
告诉编译器该符号存在于其他地方,它可能位于也可能不在同一个翻译单元中。链接器的工作是确保所有声明的符号都已实际定义。
常量 header (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]));
}
关于c - Objective-C 全局整数数组未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2815516/