#import все еще получает “дублирующийся символ” ошибка

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

Я думал, использовал ли я:

#import "MyConstants.h"

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

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

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

  • Ошибка происходит во время "соединения". (Я просто использую кнопку "Build and Go" XCode.)
  • Я также попробовал (ненужный с #import) #ifndef/def метод, также.
  • Возможно, я должен просто спросить это:

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

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

  • MyConstants.h> интервал thisIsGlobal = 123;
  • (Не, где я переопределяю thisIsGlobal где-нибудь в каком-либо коде.)

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

    10
    задан Susanna 2 May 2010 в 23:48
    поделиться

    4 ответа

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

    static const int thisIsGlobal = 123;
    

    или

    #define thisIsGlobal 123
    
    8
    ответ дан 3 December 2019 в 14:00
    поделиться

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

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

    2
    ответ дан 3 December 2019 в 14:00
    поделиться

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

    extern const int MyConstant;
    extern NSString * const MyStringConstant;
    

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

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

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

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

    20
    ответ дан 3 December 2019 в 14:00
    поделиться

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

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

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

    enum {thisIsGlobal = 123}; // ok

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

    3
    ответ дан 3 December 2019 в 14:00
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: