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

Sus*_*nna 2 c arrays global-variables objective-c extern

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

int abc[3];
Run Code Online (Sandbox Code Playgroud)

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

extern int abc[3] = {11, 22, 33};
Run Code Online (Sandbox Code Playgroud)

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

#import "MyConstants.h"
Run Code Online (Sandbox Code Playgroud)

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

extern int abc[];
NSLog(@"abc = (%d) (%d)", abc[1], sizeof(abc)/sizeof(int));  
Run Code Online (Sandbox Code Playgroud)

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

如何按预期工作?

dre*_*lax 5

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

常量标题(MyConstants.h):

extern int abc[3];
Run Code Online (Sandbox Code Playgroud)

常量Source(MyConstants.m):

int abc[3] = {11, 22, 33};
Run Code Online (Sandbox Code Playgroud)

其他来源(SomeFile.m):

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

此外,请注意测量阵列的大小时,它是容易出错的由所述第一元件的尺寸来划分少,因此,如果类型abc的变化(即,从intdouble),结果仍然是有效的.

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