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

Дублирующая ошибка символа - глобальная константа

В заголовке класса, вне объявления интерфейса, я объявлял глобальные константы:

NSString * const gotFilePathNotification = @"gotFilePath";
NSString * const gotResultNotification = @"gotResultOfType";

gotResultNotification используется только в этом классе (пока), но я ссылаюсь на gotFilePathNotificaion в другой реализации класса. Для этого я импортирую этот заголовок.

Когда я пытаюсь скомпилировать, я получаю дубликат символьного компоновщика ошибки в gotFilePathNotification в этом заголовке. Почему это происходит?

4b9b3361

Ответ 1

У вас есть два идентификатора с одинаковым именем в двух разных единицах компиляции в области файлов. Это нарушает одно правило определения. Вместо этого вам нужно -

  • Объявить, что глобальные метки переменных имеют внешнюю привязку в файле заголовка.

    extern NSString * const gotFilePathNotification;
    
  • Теперь укажите определение в только одном исходном файле.

    NSString * const gotFilePathNotification = @"gotFilePath";
    

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

Ответ 2

Вам нужно объявить их extern в файле заголовка и определить их в файле реализации. См. Этот вопрос для уточнения. Глобальные переменные в Cocoa/Objective-C?.

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

Ответ 3

Также убедитесь, что вы включаете файл h, а не файл m. Это сводило меня с ума.