【问题标题】:Objective-C global array of ints not working as expectedObjective-C 全局整数数组未按预期工作
【发布时间】:2010-05-12 01:07:38
【问题描述】:

在我的 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)”?

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

【问题讨论】:

  • 不应该'extern'进入.h文件而不是.m?
  • @squelart:把它作为一个答案。
  • @squelart: 哦,对不起,我不是故意要抢你的风头。如果您添加一个并删除我的,我会更新您的答案。
  • 我没有要测试的mac,也没有多少时间来写一个完整的答案......@dreamlax:不用担心,你写了一个彻底的答案,我不能做得更好,值得+1给你!

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


【解决方案1】:

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 到@987654331 @),结果仍然有效。

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

【讨论】:

    猜你喜欢
    • 2010-12-19
    • 1970-01-01
    • 2020-11-30
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多