Как определить символ препроцессора в Xcode


100

Можно ли установить символ для условной компиляции, настроив свойства в проекте Xcode?

Моя цель - создать символ, доступный для всех файлов, без необходимости использования импорта / включения, чтобы набор общих классов мог иметь особое поведение в некоторых проектах. Как следующие, но с моими собственными символами.

#if TARGET_IPHONE_SIMULATOR
    ...
#endif

Ответы:


116

Перейдите к настройкам Target или Project, щелкните значок шестеренки в левом нижнем углу и выберите «Добавить пользовательскую настройку». Имя нового параметра должно быть GCC_PREPROCESSOR_DEFINITIONS, и вы можете ввести свои определения в правом поле.

Согласно комментариям Стефа, полный синтаксис:

constant_1=VALUE constant_2=VALUE

Обратите внимание, что вам не нужно '=', если вы просто хотите # определить символ, а не задавать ему значение (для #ifdefоператоров)


2
Спасибо! Кому интересно, синтаксис выглядит как «kVarOne = 5 myVar = 3.0» (без кавычек), я нашел его методом проб и ошибок. Бен, не могли бы вы отредактировать свой ответ, чтобы указать это? Еще раз спасибо.
Стеф Тирион

1
Замечательный ответ. Из-за этого у меня все еще есть волосы. Спасибо Спасибо спасибо. +1 (я бы хотел, чтобы было больше)
Али Парр

11
FYI, начиная с Xcode 3.2.4, «Макросы препроцессора» сопоставляются с GCC_PREPROCESSOR_DEFINITIONS, а Xcode больше не позволит вам определять пользователя (поскольку он уже доступен).
Clay Bridges

11
Это больше не значок шестеренки в левом нижнем углу, а значок плюса в правом нижнем углу (вкладки «Параметры сборки» вашей цели).
Джесси Смит,

1
вам следует обновить этот ответ. значка шестеренки больше нет
Раду Симионеску

86

Вам не нужно создавать пользовательскую настройку. Встроенная настройка «Макросы препроцессора» работает нормально. альтернативный текст http://idisk.mac.com/cdespinosa/Public/Picture%204.png

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


1
Что делать, если этот раздел отсутствует в настройках сборки?
Кевин Лэйти,

3
Делайте то, что предлагает Бен Готлибб. Но начиная с версии Xcode 3.2.4, «Макросы препроцессора» сопоставляются с GCC_PREPROCESSOR_DEFINITIONS. Вы не можете определить то, что уже доступно.
Clay Bridges

41

В качестве дополнения, если вы используете эту технику для определения строк в своей цели, мне пришлось определять и использовать их следующим образом:

В настройках сборки -> Макросы препроцессора, и да, обратная косая черта важна в определении:

APPURL_NSString=\@\"www.foobar.org\"

И в исходном коде:

objectManager.client.baseURL = APPURL_NSString;

Спасибо за это решение, искал что-то ИМЕННО подобное, но переполнение стека полно сложных решений.
Дэвид П.

5

Вы можете использовать этот *_Prefix.pchфайл для объявления макросов проекта. Этот файл обычно находится в вашей группе « Другие источники ».


3

Он находится в разделе «GCC 4.2 Preprocessing» (или просто введите «prepro» в поле поиска) ...

... однако, хоть убей, я не могу заставить его работать.

У меня есть стандартные конфигурации отладки и выпуска, и я хочу определить DEBUG = 1 в конфигурации отладки. Но после добавления его в качестве значения:

(в окне настроек)> Макросы препроцессора: DEBUG = 1

#if DEBUG
    printf("DEBUG is set!");
#endif 

... никогда не печатает / не вызывает. Это сводит меня с ума...


10
Вместо #if DEBUG попробуйте #if defined (DEBUG) или #ifdef DEBUG
Симо Салминен,

Как ни странно, я оказался здесь в 2019 году со Swift и Xcode 10.3. Это может оказаться полезным для всех, у кого возникла проблема, описанная выше; это определенно #if DEBUG
jeff-h

1

В ответ на комментарий Кевина Лэйти (см. Ответ cdespinosa) о том, что раздел предварительной обработки GCC не отображается в настройках сборки, сделайте активным SDK тот, который говорит (Базовый SDK) после него, и этот раздел появится. Вы можете сделать это, выбрав меню «Проект»> «Установить активную цель»> «XXX (базовый SDK)». В разных версиях XCode (базовый SDK) могут быть разные, например (настройка проекта или значение проекта по умолчанию).

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


1

Для проекта Xcode 9.4.1 и C ++. Добавление const char*макросов препроцессора в сборки отладки и выпуска .

  1. Выберите свой проект

    выберите проект

  2. Выберите настройки сборки

    выберите настройки сборки

  3. Искать « Макросы препроцессора »

    search1 search2

  4. Открыть интерактивный список

    открыть интерактивный список

  5. Добавьте свои макросы и не забудьте избежать цитаты

    добавить путь

  6. Использовать в исходном коде как обычно const char*

    ...
    #ifndef JSON_DEFINITIONS_FILE_PATH
    static constexpr auto JSON_DEFINITIONS_FILE_PATH = "definitions.json";
    #endif
    ...
    FILE *pFileIn = fopen(JSON_DEFINITIONS_FILE_PATH, "r");
    ...

0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.