2013-11-08 3 views
2

У меня есть C-массив CGPoint, который я хочу объявить в файле заголовка .h.Как объявить C-массив в файле заголовка?

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) 
}; 

Это дает мне ошибку, указывающую на первой открывающей скобки: Ожидаемое выражения

Im не очень используется с C-массивы, как правильно это сделать?

EDIT

Я попытался с extern в заголовочном файле, но я получаю сообщение об ошибке: Имя Тип не позволяет Запоминающее быть указан.

+0

Просьба показать раздел заголовка, где вы объявляете 'extern CGPoint checkPoint [8];' Это должно быть сделано вне любого объявления типа/интерфейса, иначе 'extern' недействительно. – dasblinkenlight

+0

О, я не знал, что это должно быть вне @interface, я больше не получаю эту ошибку, но я все еще получаю ошибку, когда пытаюсь дать ей значение. – Arbitur

+0

Это тоже должно быть вне любого блока '@ implementation' в файле .m, и он не может вызывать' CGPointMake'. – dasblinkenlight

ответ

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.

+0

Я уже пробовал это, жаль, что не включил его в вопросе, когда я использую extern, я получаю сообщение об ошибке: Имя типа не позволяет указать класс хранения. – Arbitur

+0

@Arbitur Вы пытаетесь объявить переменную extern как переменную экземпляра для класса? Есть четыре или пять вопросов SO, связанных с этим сообщением об ошибке, и все они связаны с помещением 'extern' или' static' в объявление переменной экземпляра. – JeremyP

2

Объявить как extern CGPoint checkPoint[8] в заголовке, а затем в один исходный файл, вы можете инициализировать его как CGPoint checkPoint[8] = { { 0.0f, -10.0f }, { 10.0f, 0.0f }, … };

Без extern вы бы определяя его заново в каждом файле, который включает в себя заголовок. Инициализаторы также должны быть константами времени компиляции.

Смежные вопросы