2016-08-25 2 views
-1

Я компиляции моей программы, но на стадии компоновки, я получаю сообщение об ошибке:Как файл .m видит переменную, объявленную в другом файле .m?

ld: 1 duplicate symbol for architecture x86_64 

У меня есть 2 разных классов, и каждый из них содержит переменную в ее .m файл внутри @implementation (конечно Я знаю, какой). Если я меняю имя одного из них, он работает. в this link Я вижу, что то, что объявлено в .m, является «частным», поэтому я не понимаю, откуда эта ошибка, и как ее исправить.

Примечание - сделать мой вопрос яснее: Скажем, у меня есть класс EiffelTower и другой класс NiceGreenMonkey, они оба являются подклассами NSObject, и они оба имеют переменную mAge (в реальной жизни это (NSMutableDictionary *) someData) ,

Где и как объявить эту переменную (mAge), чтобы я не получил ошибку?

+1

Не могли бы вы добавить фрагменты кода, чтобы показать проблему? – Losiowaty

+0

вы добавили в свои проекты два объекта с одинаковым именем. Просто скопируйте ошибку папок, чтобы получить фактическое имя объекта, или вы можете искать urself в журнале ошибок. –

+0

Это основное заблуждение о том, как работает C/Obj-C. Ограничение заголовка ограничивает видимость, а не конфиденциальность.Также существует большая разница между компиляцией и привязкой. – Sulthan

ответ

0

Поскольку вы не указали код, это только предположение: если вы объявляете глобальную переменную в файле Objective-) C, то скомпилированный двоичный файл будет иметь эту глобальную переменную как общедоступный символ. Если вы используете одно и то же имя для глобалов в разных файлах, а затем попытаетесь объединить скомпилированный двоичный файл в одно и то же приложение, вы получите дублируемую ошибку символа от связанного/загрузчика (ld в вашей ошибке).

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

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

Ответ на комментарий

Ваши переменные не переменные экземпляра, вы не получите ошибку, вы должны, если они были. Поэтому моя догадка была неправильной, вместо этого вы неправильно указали свои переменные экземпляра. Вот почему вы всегда должны указывать свой код при задании вопросов. Все, что я могу сделать, это снова угадать. Вот как должны выглядеть выражения переменных переменных экземпляра:

@implementation SomeClass 
{ // open brace indicates start of instance declarations 
    int birdCount; // an instance variable 
    // ... 
} // close brace, end of instance variables 

// methods... 

@end 

Вы пропустили брекеты? Если у вас есть, то вы объявили глобальные, а не переменные экземпляра.

Если эта догадка по-прежнему не так, измените свой вопрос и добавьте свой код! Вам повезло, что сообщество SO не закрыло ваш вопрос, вам нужно помочь людям помочь вам.

HTH

+0

Благодарим вас за ответ, но статический модификатор установит переменную как «переменную класса», а не «переменную экземпляра», поэтому она будет работать, но что еще это значит? – NGG

+0

@NGG - см. Отредактированный ответ – CRD

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