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

标签 c objective-c arrays global-variables extern

在我的 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 的类型发生变化(即从 intdouble),结果仍然有效。

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

关于c - Objective-C 全局整数数组未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2815516/

相关文章:

iphone - FBWebDialog 在 iOS 7 中出现时消失

c - 为什么 strchr 比我的 simd 代码快两倍

c - 这段代码是如何工作的,这是一个好的做法吗?

android - 如何通过 SIM_IO 从 sim 卡读取 MSISDN?

iphone - 将图像添加到 UIActionSheet UIButton 和 App Approval

ios - 音乐转换以及如何知道是否写入完成

javascript - 如何在 JavaScript 中将数组元素插入所需位置?

python - 从数组中取出一个范围

C - 用空格分隔成整数数组的数字字符串

c - 声明不兼容