2014-01-30 3 views
1

У меня было много похожих вопросов, но ни один из них не имел действительно хорошего ответа о том, что мне нужно. Мне интересно, как написать константы в файле .h. мой файл констант - это просто чистый файл без импорта, просто очистите файл .h. Я импортирую его в файл префикса. , когда я используюobject-c constants.h static const

static NSInteger someInteger = 1; 

или

static BOOl someBool = YES; 

компилятор компилирует нормально, но дает мне предупреждение, что эта переменная не используется, даже если им с помощью его несколько раз в разных классах. Но если я использую

static NSString* someString = @""; 

нет никаких предупреждений.

также, если я использую

const NSInteger someInteger = 1; 

компилятор компилирует нормально для реального устройства, но при работе на тренажере он не компилируется с ошибкой duplicate symbols for architecture i386

также то, что разница между

const NSString* someString = @""; 
const NSInteger someInteger = 1; 

и

NSString* const someString = @""; 
NSInteger const someInteger = 1; 

Я закончил с использованием static const NSInteger someInteger =1;, но мне интересно, если это правильный вариант. Итак, действительно мой вопрос: какие слова я должен использовать для успешного создания файла constants.h?

ответ

1

Для всех типов (как примитивные или иным образом), то вам необходимо обеспечить единую реализацию его где-то:

constants.h:

extern const int someValue; 
extern NSString * const someString; 

constants.m:

const NSInteger someValue = 1; 
NSString * const someString = @"Some string"; 

Вы никогда не хотите использовать переменные static в заголовочных файлах, так как у вас будет множество копий «константы» в каждом файле реализации, который включает этот заголовок (они могут не иметь t расстроить компоновщик и вызвать ошибку связи, но они есть).

+0

но когда я использую const NSInteger someInteger = 1; компилятор выдает ошибку о повторяющихся символах – t0a0

+0

@TrenboloneA Используете ли вы '#import" константы.h "', а не '#include" constants.h "?? Вы уверены, что 'someInteger' еще не объявлен в файле реализации? – trojanfoe

+0

Да, имейте в виду. может быть, это потому, что константы являются чистым листом, а не подклассом без реализации и интерфейса? – t0a0

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