#import все еще получает ошибку "дубликат символа"
Когда я компилирую приложение для iPhone, xCode выдает ошибку "duplicate symbol" для моих переменных в MyConstants.h
Я думал, что если бы я использовал:
#import "MyConstants.h"
это позволит избежать этого?
Но у меня все еще есть проблема.
Добавленная информация:
Может быть, я должен просто спросить это:
Если бы вам нужно было получить доступ к константе в КАЖДОЙ части ВСЕХ ваших файлов исходного кода... что бы вы поместили в ваш файл.h? Что бы вы использовали, чтобы включить эту константу в другие части вашего кода.
Я думал (но я думаю, что нет), это было просто, как:
(Нет, где я переопределяю thisIsGlobal где-нибудь в любом коде.)
А затем просто "#import MyConstants.h" в верхней части каждого из моих других исходных файлов.
5 ответов
Что вы можете сделать, это положить в свой заголовок (MyConstants.h
):
extern const int MyConstant;
extern NSString * const MyStringConstant;
И в исходном файле, включите заголовок выше, но определите константы (MyConstants.m
):
const int MyConstant = 123;
NSString * const MyStringConstant = @"SomeString";
Затем вам просто нужно включить заголовок в любой другой исходный файл, который использует любую из этих констант. Заголовок просто объявляет, что эти константы где-то существуют, поэтому компилятор не будет жаловаться, потому что задача компоновщика - разрешить эти имена констант. Исходный файл, содержащий ваши определения констант, компилируется, и компоновщик видит, что именно там находятся константы, и разрешает все ссылки, найденные в других исходных файлах.
Проблема с объявлением и определением константы в заголовке (который не объявлен как static
) компилятор обрабатывает его как независимый глобал для каждого файла, который включает этот заголовок. Когда компоновщик пытается связать все ваши скомпилированные исходники вместе, он встречает глобальное имя столько раз, сколько вы включили MyConstants.h
,
Два варианта:
static const int thisIsGlobal = 123;
или же
#define thisIsGlobal 123
Я использую как это, и работает: (в.h за пределами @interface)
static NSString * const mkLocaleIdentifierUS = @"en_US";
static NSString * const mkLocaleUserSystemSettings = nil;
Это связано с тем, что рассматриваемое имя символа (thisIsGlobal) передается в каждый созданный объектный файл, где заголовок, содержащий объявление для thisIsGlobal, включен и видим.
Примеры, предоставленные другим автором: "extern const int MyConstant;" это лучший способ, если вам не нужно, чтобы значение было видимым, в этом случае вы можете использовать enum:
int thisIsGlobal = 123; // плохой
enum { thisIsGlobal = 123 }; // Хорошо
использование статики будет испускать много скрытых символов в большой программе - не используйте ее. Использование определения также пугает (учитывая, что есть более безопасные альтернативы, почему бы не использовать их?).
Я обычно помещаю файл констант моего приложения в проект Xcode MyApplication_Prefix.pch
файл, как правило, находится внутри Other Sources
группа. Любой заголовочный файл, включенный в этот pch
файл будет включен из всех файлов в вашем проекте.
После добавления этого оператора включения вам больше не нужно будет включать MyConstants.h
файл из каждого файла в вашем проекте - он будет включен автоматически.