Правильное объявление глобальных C-констант в Objective-C

Я пытаюсь объявить и инициализировать глобальные переменные C.

const int numberOfTickMarks = 6;
const double tickValues[numberOfTickMarks] = {500, 2000, 3000, 4000, 6000, 8000};

Когда я делаю это в своем заголовочном файле (до @interface), я получаю ошибку компоновщика. Но когда я делаю это в файле .m (до @implementation), все работает как надо.

Является ли последний приемлемым способом объявления глобальных констант для C/Objective-C?


person JohnK    schedule 08.05.2013    source источник
comment
stackoverflow.com/questions/4481554/   -  person matt    schedule 08.05.2013
comment
Вопрос в том, хотите ли вы их только для одного файла или для нескольких файлов. Вы не собираетесь #импортировать файл .m, поэтому последнего (const double в файле .m) будет недостаточно во втором случае.   -  person matt    schedule 08.05.2013


Ответы (3)


Ваши глобальные переменные должны быть объявлены в заголовочном файле следующим образом:

extern const int numberOfTickMarks;
extern const double tickValues[numberOfTickMarks];

Без extern ошибки компоновщика неизбежны.

В файле реализации вам нужно будет снова определить их следующим образом:

const int numberOfTickMarks = 6;
const double tickValues[numberOfTickMarks] = {500, 2000, 3000, 4000, 6000, 8000};
person user123    schedule 08.05.2013
comment
Таким образом, вы говорите, что мне просто нужно добавить extern к объявлениям, которые я поместил в заголовочный файл. Конечно, numberOfTickMarks там все еще не определено, поэтому его нельзя использовать для длины массива. Я хотел бы сделать так, чтобы мне пришлось менять как можно меньше кода. Есть ли способ разрешить numberOfTickMarks в определении массива? - person JohnK; 08.05.2013
comment
(Извините, перепутал объявление и определение.) Есть ли у компилятора способ получить размер массива? Если это так, я мог бы использовать это для *define*/set numberOfTickMarks. - person JohnK; 08.05.2013
comment
sizeof(tickValues)/sizeof(*tickValues) = размер массива - person user123; 08.05.2013

Что бы я сделал в случае, когда у меня есть «магическое число», это #define:

#define NUM_TICK_MARKS 6

Он может храниться в файле .m, но если он будет широко использоваться, я могу поместить его в файл .pch.

И кстати:

numberOfTickMarks не требуется:

const double tickValues[numberOfTickMarks] = {500, 2000, 3000, 4000, 6000, 8000};

Инициализатор совершенно ясно говорит, насколько велик массив!

person matt    schedule 08.05.2013

Почему бы не определить их в файле main.m?

type myVar;

И объявите в заголовке, используйте:

extern type myVar;

Редактировать

Судя по тому, что вы написали в комментариях, я думаю, вам нужно использовать переменные класса. Поскольку этот ресурс недоступен в Objective-C, я вижу 2 альтернативы:

1) Используйте С++, как в этом ответе SO

2) Используйте общий экземпляр, как описано в этом ответе.

Лично я бы выбрал номер 2

person luksfarris    schedule 08.05.2013
comment
Это не кажется подходящим, поскольку переменные подходят для моего viewController, а не для проекта в целом. - person JohnK; 08.05.2013
comment
чем зачем использовать глобальные переменные? Переменные класса и экземпляра — это то, что вам нужно искать - person luksfarris; 08.05.2013
comment
Потому что я хочу, чтобы они были доступны для некоторых статических функций, определенных в viewController.m и соответствующих этому viewController. - person JohnK; 08.05.2013
comment
@JohnK Тогда зачем вам вообще нужно, чтобы они были внешними ? - person ; 08.05.2013
comment
@ H2CO3, где я сказал, что они должны быть внешними? - person JohnK; 09.05.2013