Макросы целевого препроцессора игнорируются препроцессором в Xcode

Я добавил TEST=1 в раздел Preprocessor Macros цели проекта Build Settings, и всякий раз, когда я использую его в коде, препроцессор считает, что он не определен.

  1. alt + щелчок по нему показывает вопросительный знак
  2. Раскраска синтаксиса не работает
  3. Автозаполнение синтаксиса не работает должным образом

Например, имея:

#if TEST

// a

#else

// b

#endif

имеет такое поведение:

  1. Подсветка синтаксиса работает только для // b
  2. Автозаполнение синтаксиса работает только для // b

Это связано с тем, что препроцессор не может найти TEST (даже если он определен как 1, как я уже говорил ранее), поэтому он обрабатывает его как false.

Есть ли способ решить эти проблемы?

Изменить:

Мой вариант использования связан с несколькими целями проекта. Итак, предположим, что начальная цель называется First, для которой определен макрос препроцессора TEST со значением 1.

Если я создам еще одну цель проекта с именем Second без определенных макросов препроцессора и захочу добавить для нее некоторый код, только если TEST равно 0 (false/не определено), я помещу его в блок #else (// b).

Зная, что раскраска синтаксиса и автозаполнение работают для // b, похоже, что все работает нормально, но если я изменю текущую цель на First (каламбур) и даже соберу ее, она все равно будет работать как Second выбрано.


person Iulian Onofrei    schedule 02.03.2017    source источник
comment
если вы создадите проект, препроцессор обнаружит флаги времени компиляции и покажет раскрашивание и автозаполнение. ты пробовал это?   -  person manishg    schedule 09.03.2017
comment
Конечно, я построил проект.   -  person Iulian Onofrei    schedule 09.03.2017
comment
Вы сделали это как для отладки, так и для выпуска? Это работает на моем конце.   -  person manishg    schedule 09.03.2017
comment
Это не имеет ничего общего с конфигурациями сборки. Я обновил свой вопрос.   -  person Iulian Onofrei    schedule 09.03.2017


Ответы (3)


Если вы хотите сделать это так в Swift, вы должны добавить параметр User-Defined с именем OTHER_SWIFT_FLAGS в свой Build Settings следующим образом:

OTHER_SWIFT_FLAGS определяемая пользователем настройка

И затем в своем коде вы вводите:

#if TEST1

// Debug

#endif

#if TEST2

// Release

#endif

Я не знаю, зачем вам это нужно, но может быть интересно изучить нативную цель Xcode, чтобы использовать определенное поведение для нескольких приложений с одним и тем же корневым проектом. Если это то, что вам нужно, вам следует изучить следующую статью: AppCoda с использованием целей с Xcode< /а>.

person cdescours    schedule 15.03.2017

Просто перейдите в target-> Edit Scheme -> Run -> Info и проверьте конфигурацию сборки. Теперь, добавляя макросы препроцессора в настройку сборки, просто убедитесь, что вы добавляете макрос для правильной конфигурации сборки и правильной цели.

≈

Я попытался добавить как отладочную, так и выпускную сборку, как указано выше, для моего целевого приложения (Test-ObjectiveC). Поэтому, когда я попробовал код ниже с этой настройкой, вы можете увидеть цвет синтаксиса соответственно.

введите здесь описание изображения

person Harish Gupta    schedule 10.03.2017
comment
И что происходит, когда вы нажимаете cmd +? - person Iulian Onofrei; 10.03.2017
comment
@lulian не уверен, что вы хотите проверить с помощью cmd + click. - person Harish Gupta; 10.03.2017
comment
Мне просто интересно, умеет ли он открывать Build Settings или показывает вопросительный знак, как в моем примере. Могут быть другие настройки моего большого проекта, которые мешают этому. Я попробую проверить это сам в новом проекте и попытаюсь выяснить, вызвана ли проблема одной из моих настроек. - person Iulian Onofrei; 11.03.2017

Я смог заставить его работать, установив Target-> Build Settings-> All-> Swift Compiler — Custom Flags —> Active Compilation Conditions.

XCode версии 12.3

person MartinZ    schedule 11.03.2021