#objective-c #frameworks #linker #nsstring #c-preprocessor
#objective-c #фреймворки #компоновщик #nsstring #c-препроцессор
Вопрос:
У меня есть действительно маленькое облегченное приложение, которому необходимо использовать некоторые константы, которые хранятся в более крупном фреймворке. Я не хочу дублировать эти константы и жестко кодировать их в облегченном приложении, но я также не хочу связываться с большим фреймворком, чтобы просто получить константы.
Константы определяются с помощью static NSString *const
в файле заголовка. Предотвращает ли замена static NSString *const
на #define
необходимость привязки ко всему фреймворку?
Честно говоря, я не совсем уверен, как работает связывание, поэтому я, вероятно, думаю об этом неправильно
Комментарии:
1. Если фреймворк переключается на
#define
для этих констант, он больше не может их изменять. Пока они являются реальными символами, автор фреймворка может свободно изменять значения, поскольку приложения будут извлекать текущее значение во время выполнения. Но#define
сохраняет значение во время компиляции. Какой бы вы ни использовали, это действительно зависит от того, насколько вы заботитесь об этом.2. Все в порядке, эти значения не должны сильно измениться
3. Почему вы хотите избежать привязки к фреймворку? Если вас беспокоит размер исполняемого файла, компоновщик удалит все символы из фреймворка, на которые нет ссылок, поэтому вы используете только то, что вам нужно.
Ответ №1:
Да, если вы #определяете константы, вам просто нужно #импортировать файл .h, который их содержит.
Вам нужно знать, что константы #defined являются буквальными заменами текста — у них нет «типа» и т.д., Как у статических значений const.
Но другой вариант (только для целочисленных констант) — определить перечисления в стиле C в файле .h.
Комментарии:
1. Спасибо, я прочитал здесь много сообщений, в которых говорилось, что const лучше, поэтому я хотел убедиться, прежде чем использовать #define. Мне также нужны строки, поэтому я не могу использовать перечисления
2. Конечно, элита программирования считает #defines немного скучным делом, но на самом деле языки на основе C не предлагают большого количества опций, поэтому вам приходится довольствоваться тем, что работает.