В настоящее время я работаю над проектом, который имеет много зависимостей. Он написан на Objective-C с библиотеками C ++. Он использует кросс-платформенный код с условной компиляцией для разных платформ в библиотеках.
После последнего обновления я столкнулся со специфической проблемой с макросами препроцессора с этим
#if defined(DEBUG)
#warning WARNING_1
#elif defined(DEBUG_gibberish)
#warning WARNING_2
#elif defined(SOMETHING)
#warning WARNING_3
#else
#warning WARNING_DEFAULT
#endif
код.
В этом случае DEBUG
макрос определен в разделе предварительной обработки Xcode Apple LLVM 6.0
Пожалуйста, смотрите рис
Таким образом, в основном проблема в том, что #if define () не работает так, как ожидалось для этого конкретного проекта. Если я скопирую тот же код в какой-нибудь чистый тестовый проект, он будет работать как положено.
Это также имеет другой интересный эффект, если я определю DEBUG_gibberish
тогда он будет оценен вместо другого случая. После выполнения нескольких экспериментов кажется, что он всегда оценивает / использует первое истинное условие, а затем второе истинное условие или #else
если бы не было второго истинного условия.
Я уже пытался очистить проект, очистить производные данные, перезапустить Xcode, перезагрузить мой mac и даже куклы вуду.
Буду признателен за любую мысль о том, почему это происходит и как это исправить.
EDIT1: у меня есть иерархия проектов XCode в моем основном проекте. Проблемная библиотека — это подпроект в моем основном проекте. Если я пытаюсь построить его отдельно, он работает нормально. Если я скомпилирую это как зависимость от основного проекта, я столкнусь с этой проблемой.
Хорошо, я нашел проблему.
Я использую некоторые заголовки из сторонних библиотек в своем проекте, чтобы создать свои собственные подклассы классов библиотек.
Я полагаю, что Xcode дает составное представление предупреждений:
В моем коде это показывает WARNING_1
после предварительной обработки заголовка в
библиотека где DEBUG
макрос определен.
Тогда это показывает WARNING_DEFAULT
после предварительной обработки того же заголовка
в моем проекте, где DEBUG
макрос не определен.
Но оба предупреждения отображаются так, как будто они находятся в одном файле.
Сделав это, я пришел к выводу, что что-то не так с препроцессором или моим кодом. Из-за этого я не думал о простой вещи, что мой проект и библиотека построены отдельно, и мой проект не содержит необходимых макросов.
Таким образом, в итоге решение было простым, я должен был определить необходимые макросы в своем проекте, и затем он скомпилировался нормально.