如何在头文件中声明一个C数组?

时间:2013-11-08 10:31:41

标签: ios objective-c c arrays

我有一个CGPoint的C数组,我想在头文件中声明.h。

CGPoint checkPoint[8];

但是当我尝试在.m中给它一个值时:

checkPoint[8] = { //<-- Error Here
    CGPointMake(0, -10),
    CGPointMake(10, 0),
    CGPointMake(0, 10),
    CGPointMake(-10, 0),
    CGPointMake(-10, -10),
    CGPointMake(10, -10),
    CGPointMake(10, 10),
    CGPointMake(-10, 10)
};

它指向第一个左括号的错误:预期表达式

我不太习惯使用C数组,这样做的正确方法是什么?

修改

我在头文件中尝试使用extern但是我收到此错误消息:类型名称不允许指定存储类。

2 个答案:

答案 0 :(得分:3)

您需要在标题中的声明中添加extern

extern CGPoint checkPoint[8];

这将使它成为一个声明,而不是声明/定义。请注意,由于在初始化程序中调用CGPointMake,定义将无法编译(必须是编译时常量,但CGPointMake是函数)。

您可以将CGPointMake替换为{.x= 0, .y=-10}样式的初始值设定项,如下所示:

checkPoint[8] = { //<-- Error Here
    {.x=0,   .y=-10},
    {.x=10,  .y=0},
    {.x=0,   .y=10},
    {.x=-10, .y=0},
    {.x=-10, .y=-10},
    {.x=10,  .y=-10},
    {.x=10,  .y=10},
    {.x=-10, .y=10}
};

注意:(响应要提问的评论主题)

extern用于声明全局变量。它们不属于任何类,因此它们的声明必须在@interface之外,并且它们的定义必须在@implementation块之外。

答案 1 :(得分:2)

在标头中将其声明为extern CGPoint checkPoint[8],然后在一个源文件中将其初始化为CGPoint checkPoint[8] = { { 0.0f, -10.0f }, { 10.0f, 0.0f }, … };

如果没有extern,您将在包含标题的每个文件中重新定义它。初始化者也需要是编译时常量。