Як визначити символ препроцесора в Xcode


100

Чи можливо встановити символ для умовної компіляції, встановивши властивості в проекті Xcode?

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

#if TARGET_IPHONE_SIMULATOR
    ...
#endif

Відповіді:


116

Перейдіть до налаштувань Цілі чи проекту, натисніть значок шестірні внизу зліва та виберіть "Додати налаштування, визначені користувачем". Нова назва налаштування повинна бути GCC_PREPROCESSOR_DEFINITIONS, і ви можете вводити свої визначення в правому полі.

За коментарями Стефа, повний синтаксис:

constant_1=VALUE constant_2=VALUE

Зауважте, що значки '=' вам не потрібно, якщо ви просто хочете #define символ, а не надавати йому значення (для #ifdefвисловлювань)


2
Дякую! Кому когось цікаво, синтаксис виглядає як "kVarOne = 5 myVar = 3.0" (без лапок), я знайшов це шляхом спроб та помилок. Бен, ти міг би відредагувати свою відповідь, щоб вказати це? Знову дякую.
Стеф Тіріон

1
Дивовижна відповідь. У мене все ще є волосся через це. Дякую, дякую, дякую. +1 (я б хотів, щоб це було більше)
Алі Парр

11
FYI, станом на Xcode 3.2.4, "Макроси препроцесора" відображаються на GCC_PREPROCESSOR_DEFINITIONS, і Xcode не дозволить вам більше визначати користувача (оскільки він уже доступний).
Глиняні мости

11
Це вже не значок шестірні в нижній лівій частині, а натомість значок Плюс в нижньому правому куті (на вкладці "Налаштування збірки" вашої цілі).
Джессі Сміт

1
вам слід оновити цю відповідь. вже немає значка передач
Раду Сіміонеску

86

Вам не потрібно створювати налаштовані користувачем налаштування. Вбудована настройка "Препроцесорні макроси" працює чудово. alt text http://idisk.mac.com/cdespinosa/Public/Picture%204.png

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


1
Що робити, якщо цей параметр відсутній у налаштуваннях збірки?
Кевін Лаїт

3
Робіть те, що пропонує Бен Готліб. Але, починаючи з версії 3.2.4 Xcode, "макроси препроцесора" відображаються на GCC_PREPROCESSOR_DEFINITIONS. Користувач не може визначити щось вже доступне.
Clay Bridges

41

Як додаток, якщо ви використовуєте цю техніку для визначення рядків у своїй цілі, я повинен був їх визначити та використовувати:

У Налаштуваннях збірки -> Макроси препроцесора, і зворотні косої риски важливі для визначення:

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

І у вихідному коді:

objectManager.client.baseURL = APPURL_NSString;

Дякуючи за це рішення, шукали щось саме ТОЧЕ, як це, але переповнення стека переповнене складними рішеннями.
Девід П

5

Ви можете використовувати *_Prefix.pchфайл для оголошення макросів проекту. Цей файл зазвичай знаходиться в групі " Інші джерела ".


3

Це під "GCC 4.2 попередня обробка" (або просто поставте "попереднє" у вікні пошуку) ...

... проте за все життя я не можу змусити його працювати.

У мене є стандартні конфігурації налагодження та випуску, і я хочу визначити DEBUG = 1 у конфігурації налагодження. Але після додавання його як значення:

(у вікні налаштувань)> Макроси препроцесора: DEBUG = 1

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

... ніколи не друкує / не називається. Це зводить мене з розуму ...


10
Замість #if DEBUG спробуйте #if визначено (DEBUG) або #ifdef DEBUG
Simo Salminen

Як не дивно, я опинився тут у 2019 році, зі Swift та Xcode 10.3. Будь-хто з тим самим описаним вище питанням може вважати це корисним; це, безумовно, привело мене #if DEBUGв життя :) stackoverflow.com/a/47395485/2778502
jeff-h

1

У відповідь на коментар Кевіна Лаїта (див. Відповідь cdespinosa) про те, що розділ попередньої обробки GCC не відображається у налаштуваннях збірки, зробіть Active SDK тим, що пише (Base SDK) після цього, і цей розділ з’явиться. Це можна зробити, вибравши меню Проект> Встановити активну ціль> XXX (Базова SDK). У різних версіях XCode (Base SDK) може бути різним, наприклад (Налаштування проекту або Проект за замовчуванням).

Після того, як з'явиться цей розділ, ви можете додати свої визначення до макросів процесора, а не створювати визначені користувачем налаштування.


1

Для проекту Xcode 9.4.1 та C ++. Додавання const char*препроцесорних макросів до версій налагодження та випуску .

  1. Виберіть проект

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

  2. Виберіть Налаштування збірки

    виберіть налаштування збірки

  3. Пошук " Макроси попереднього процесу "

    пошук1 пошук2

  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.