2

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

int abc[3];

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

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

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

#import "MyConstants.h"

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

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

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

我如何使这项工作按预期进行?

4

1 回答 1

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变化(即从intdouble),结果仍然有效。

- (void) someMethod
{
    NSLog(@"abc = (%d) (%d)", abc[1], sizeof(abc)/sizeof(abc[0]));
}
于 2010-05-12T01:36:12.217 回答