#ios #c #xcode #c-preprocessor
#iOS #c #xcode — код #c-препроцессор
Вопрос:
Есть ли инструкция препроцессора для сбоя сборки XCode? (или pragma_mark или что-то еще)
Например, я разрабатываю приложение для 3 разных сред, включая несколько веб-URL для извлечения. Пока я не знаю URL-адрес, который будет использоваться для производственной среды, и я хочу вставить инструкцию в свой код, чтобы предотвратить ожидаемую сборку от запуска в этой среде.
Мой код выглядит так
#ifdef ENV1
...
#endif
#ifdef ENV2
...
#endif
#ifdef ENV3
#some_instruction_that_prevent_success_build
...
#endif
Другими словами, мне нужна инструкция, которая действует как блокирующее задание.
Комментарии:
1. Ошибка #работает нормально, но почему это должна быть инструкция препроцессора? Вы могли бы использовать
@@@ TODO
так же просто.2. Мои 2 проблемы заключаются в том, что я хочу, чтобы проект компилировался и запускался для ENV1 и ENV2 и завершался сбоем только для ENV3, и если сообщение об ошибке может быть настроено на то, которое я установил, а не на общую ошибку. Например, используя @@@ TODO, вы получите сообщение «Проблема с синтаксическим анализом — неожиданный «@» в программе», которое может напугать клиента.
Ответ №1:
Директива препроцессора ошибок — это то, что вам нужно.
#error "Danger, Will Robinson!"
Комментарии:
1. Это работает… но, похоже, это просто потому, что это неизвестная инструкция препроцессора. 🙂 Какой-нибудь хороший онлайн-ресурс, который порекомендует документацию по всем инструкциям предварительной обработки?
2. Я абсолютно уверен, что #error является известной инструкцией препроцессора — она задокументирована в препроцессоре GCC C ( cs.utah.edu/dept/old/texinfo/cpp/cpp.html#SEC37 ).
3. @Dirty Henry: посмотрите, что компилятор сообщает вам, когда видит эту директиву при попытке компиляции.
4. @Dirty Henry:
#error
является частью стандарта C. (#warning
однако это не так.) Если вам нужен список директив препроцессора, получите копию K amp; R или копию стандарта ( open-std.org/JTC1/SC22/wg14/www/docs/n1124.pdf )5.
#error
определяется в разделе 6.10.5 стандарта ISO C 1999 года. Это также входит в стандарт ANSI 1989 года, поэтому ваш компилятор будет поддерживать его, если только он не очень старый (а если он настолько старый, у вас есть другие проблемы). Его преимущество в том, что компилятору не разрешается выполнять работу, если#error
директива не пропущена с помощью#if
,#ifdef
, или#ifndef
; для любых других ошибок компилятор может выдать предупреждение и продолжить.