Проверить наличие структуры во время компиляции? - программирование
Подтвердить что ты не робот

Проверить наличие структуры во время компиляции?

Я работаю над проектом с открытым исходным кодом, который может по желанию использовать структуру с закрытым исходным кодом. Если в проект включена инфраструктура с закрытым исходным кодом, будут добавлены дополнительные функции. Но если структура не включена в проект, проект все равно должен правильно компилироваться.

Как проверить во время компиляции, если структура включена в проект?

В принципе, я хочу сделать что-то вроде этого:

#ifdef _MY_FRAMEWORK_EXISTS
#import <MyFramework/MyFramework.h>
#endif

Я видел более старые вопросы от 2-х лет назад как этот, но ответа не появилось, поэтому я мог бы пропустить что-то новое сейчас.

Я НЕ хочу проверять во время выполнения через NSClassFromString(), потому что это произойдет во время компиляции, когда я пытаюсь импортировать MyFramework, и он не существует.

4b9b3361

Ответ 1

Вы можете проверить наличие файла заголовка, используя расширение __has_include. http://clang.llvm.org/docs/LanguageExtensions.html#include-file-checking-macros

Однако это говорит только о том, установлен ли файл заголовка. Он не может сказать вам, связана ли ссылка с бинарными связями с библиотеками.

Ответ 2

Я рекомендую прочитать Mac Developer Library: Руководство по программированию на платформе (в котором содержится раздел "Слабая связь" ).

  • Что вы подразумеваете под "существует" или "включено в проект"? Вы имеете в виду добавление в фазу сборки Link Binary With Libraries (как описано Включая рамки)? Все, что делает, влияет на ссылку, а не на сборку, фазу сборки. Чтобы увидеть это, постройте. Затем выполните поиск -framework в журнале сборки Xcode Log Navigator.

    Итак, да, если вы хотите повлиять на компиляцию кода, который вы указали, вы можете вручную определить макрос _MY_FRAMEWORK_EXISTS.

  • Я не совсем понимаю, что вы пытаетесь сделать. Можете ли вы объяснить, что хотите на более высоком уровне? Возможно, есть лучший способ сделать это.

    "Минимальные накладные расходы" хороши, но слишком много магии может сбивать с толку. Например, магия Xcode скрывает то, что действительно происходит при включении фреймворка.

    Я также рекомендую проверить, как Facebook SDK для iOS работает для идей высокого и низкого уровня. Он может делать то, что вы хотите сделать.