Подтвердить что ты не робот

#import все еще получает ошибку "дубликат символа"

Когда я скомпилирую свое приложение для iPhone, xCode дает ошибку "duplicate symbol" для моих переменных в MyConstants.h

Я думал, что если бы использовал:

#import "MyConstants.h"

он избежал бы этого?

Но у меня все еще есть проблема.

Добавлена ​​информация:

Ошибка возникает во время "связывания". (Я просто использую кнопку "Build and Go" xCode.)

Я также пробовал (необязательно С#import) # ifndef/def method тоже.

Возможно, мне стоит просто спросить об этом:

Если вам нужно получить доступ к константе в КАЖДОЙ части ВСЕХ файлов исходного кода... что бы вы вложили в ваш .h файл? Что бы вы использовали, чтобы включить эту константу в другие части вашего кода.

Я подумал (но, я думаю, это не так) было просто:

MyConstants.h > int thisIsGlobal = 123;

(Нет, где я переопределяю thisIsGlobal в любом месте любого кода.)

И затем просто "#import MyConstants.h" в верхней части каждого из моих других исходных файлов.

4b9b3361

Ответ 1

Что вы можете сделать, это поместить в свой заголовок (MyConstants.h):

extern const int MyConstant;
extern NSString * const MyStringConstant;

И в исходном файле включите заголовок выше, но определите константы (MyConstants.m):

const int MyConstant = 123;
NSString * const MyStringConstant = @"SomeString";

Затем вам просто нужно включить заголовок в любой другой исходный файл, который использует любую из этих констант. Заголовок просто объявляет, что эти константы существуют где-то, поэтому компилятор не будет жаловаться, потому что это задание компоновщика для разрешения этих постоянных имен. Исходный файл, содержащий ваши постоянные определения, компилируется, и компоновщик видит, что это константы, и разрешает все ссылки, найденные в других исходных файлах.

Проблема с объявлением и определением константы в заголовке (который не объявляется как static) заключается в том, что компилятор рассматривает его как независимый глобальный для каждого файла, который включает этот заголовок. Когда компоновщик пытается связать все скомпилированные источники вместе, он встречает глобальное имя столько раз, сколько вы включили MyConstants.h.

Ответ 2

Два варианта:

static const int thisIsGlobal = 123;

или

#define thisIsGlobal 123

Ответ 3

Я использую это и работает: (в .h вне @interface)

static NSString * const mkLocaleIdentifierUS = @"en_US";
static NSString * const mkLocaleUserSystemSettings = nil;

Ответ 4

Это связано с тем, что указанное имя символа (thisIsGlobal) испускается в каждый созданный объектный файл, где заголовок, содержащий декларацию для этогоIsGlobal, включен и видим.

Примеры, предоставленные другим плакатом: "extern const int MyConstant;" это лучший способ, если вам не нужно, чтобы значение было видимым, и в этом случае вы можете использовать перечисление:

int thisIsGlobal = 123;//плохой

enum {thisIsGlobal = 123};//ok

используя статическую систему, выдает много скрытых символов в большой программе - не используйте ее. Использование определения также страшно (учитывая наличие более безопасных альтернатив, почему бы не использовать их?).

Ответ 5

Я обычно помещаю свой файл констант приложения в файл проекта MyApplication_Prefix.pch Xcode, обычно расположенный в группе Other Sources. Любой заголовочный файл, включенный в этот файл pch, будет включен из всех файлов в вашем проекте.

После добавления этого оператора include вам больше не нужно будет включать ваш файл MyConstants.h из каждого файла в вашем проекте - он будет включен автоматически.