Apple, LLVM 6.0, магический #if определен ()

В настоящее время я работаю над проектом, который имеет много зависимостей. Он написан на 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 в моем основном проекте. Проблемная библиотека — это подпроект в моем основном проекте. Если я пытаюсь построить его отдельно, он работает нормально. Если я скомпилирую это как зависимость от основного проекта, я столкнусь с этой проблемой.

2

Решение

Хорошо, я нашел проблему.

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

  1. Я полагаю, что Xcode дает составное представление предупреждений:

    В моем коде это показывает WARNING_1 после предварительной обработки заголовка в
    библиотека где DEBUG макрос определен.

    Тогда это показывает WARNING_DEFAULT после предварительной обработки того же заголовка
    в моем проекте, где DEBUG макрос не определен.

    Но оба предупреждения отображаются так, как будто они находятся в одном файле.

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

Таким образом, в итоге решение было простым, я должен был определить необходимые макросы в своем проекте, и затем он скомпилировался нормально.

1

Другие решения


По вопросам рекламы [email protected]