Jak zdefiniować symbol preprocesora w Xcode

100

Czy można ustawić symbol kompilacji warunkowej, ustawiając właściwości w projekcie Xcode?

Moim celem jest stworzenie symbolu, który będzie dostępny dla wszystkich plików bez konieczności używania importu / dołączania, tak aby zestaw wspólnych klas mógł mieć specjalne zachowanie w niektórych projektach. Jak poniżej, ale z moimi własnymi symbolami.

#if TARGET_IPHONE_SIMULATOR
    ...
#endif
Steph Thirion
źródło
Powiązane: „ Dodaj makro preprocesora do celu w xcode 6
koniec

Odpowiedzi:

116

Przejdź do ustawień celu lub projektu, kliknij ikonę koła zębatego w lewym dolnym rogu i wybierz opcję „Dodaj ustawienie zdefiniowane przez użytkownika”. Nowa nazwa ustawienia powinna brzmieć GCC_PREPROCESSOR_DEFINITIONS, a definicje można wpisać w polu po prawej stronie.

Zgodnie z komentarzami Steph, pełna składnia to:

constant_1=VALUE constant_2=VALUE

Zwróć uwagę, że nie potrzebujesz znaku „=”, jeśli chcesz po prostu # zdefiniować symbol, zamiast nadawać mu wartość (w przypadku #ifdefinstrukcji)

Ben Gottlieb
źródło
2
Dzięki! Dla wszystkich zainteresowanych składnia wygląda następująco: „kVarOne = 5 myVar = 3.0” (bez cudzysłowów), znalazłem ją metodą prób i błędów. Ben, czy mógłbyś zmienić swoją odpowiedź, aby to określić? Dzięki jeszcze raz.
Steph Thirion,
1
Niesamowita odpowiedź. Z tego powodu nadal mam włosy. Dziekuję Dziekuję Dziękuję. +1 (chciałbym, żeby było więcej)
Ali Parr
11
FYI, począwszy od Xcode 3.2.4, „Preprocessor Macros” mapowane jest na GCC_PREPROCESSOR_DEFINITIONS, a Xcode nie pozwoli Ci już zdefiniować użytkownika (ponieważ jest już dostępne).
Clay Bridges
11
Nie jest to już ikona koła zębatego w lewym dolnym rogu, ale ikona plusa w prawym dolnym rogu (zakładka Ustawienia budowania celu).
Jesse Smith
1
należy zaktualizować tę odpowiedź. nie ma już ikony koła zębatego
Radu Simionescu
86

Nie musisz tworzyć ustawienia zdefiniowanego przez użytkownika. Wbudowane ustawienie „Preprocessor Macros” działa dobrze. tekst alternatywny http://idisk.mac.com/cdespinosa/Public/Picture%204.png

Jeśli masz wiele obiektów docelowych lub projektów, które używają tego samego pliku prefiksu, zamiast tego użyj makr preprocesora nieużywanych w prekompilowanych nagłówkach, aby różnice w definicji makra nie wyzwalały niepotrzebnego dodatkowego zestawu wstępnie skompilowanych nagłówków.

cdespinosa
źródło
1
Co zrobisz, jeśli tej sekcji brakuje w ustawieniach kompilacji?
Kevin Laity
3
Zrób to, co sugeruje Ben Gotliebb. Ale od wersji 3.2.4 Xcode, „Preprocessor Macros” mapowane jest na GCC_PREPROCESSOR_DEFINITIONS. Nie możesz zdefiniować przez użytkownika czegoś już dostępnego.
Clay Bridges
41

Jako dodatek, jeśli używasz tej techniki do definiowania łańcuchów w celu, tak musiałem je zdefiniować i używać:

W Ustawieniach kompilacji -> Makra preprocesora i tak, ukośniki odwrotne są krytyczne w definicji:

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

A w kodzie źródłowym:

objectManager.client.baseURL = APPURL_NSString;
Stickley
źródło
Dzięki za to rozwiązanie, szukałem czegoś DOKŁADNIE takiego, a przepełnienie stosu jest pełne zbyt skomplikowanych rozwiązań.
David P
5

Możesz użyć tego *_Prefix.pchpliku do zadeklarowania makr obejmujących cały projekt. Ten plik zwykle znajduje się w Twojej grupie Inne źródła .

chunkyguy
źródło
3

Znajduje się w „GCC 4.2 Preprocessing” (lub po prostu wstaw „prepro” w polu wyszukiwania) ...

... jednak za całe życie nie mogę zmusić go do pracy.

Mam swoje standardowe konfiguracje debugowania i wydania i chcę zdefiniować DEBUG = 1 w konfiguracji debugowania. Ale po dodaniu go jako wartości:

(w oknie ustawień)> Makra preprocesora: DEBUG = 1

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

... nigdy nie drukuje / nie dzwoni. Doprowadza mnie do szaleństwa ...

HEADcRASH
źródło
10
Zamiast #if DEBUG, spróbuj #if define (DEBUG) lub #ifdef DEBUG
Simo Salminen
O dziwo, znalazłem się tutaj w 2019 roku, ze Swiftem i Xcode 10.3. Dla każdego, kto ma ten sam problem opisany powyżej, może to być pomocne; to z pewnością ożywiło mnie #if DEBUG:) stackoverflow.com/a/47395485/2778502
jeff-h
1

W odpowiedzi na komentarz Kevina Laity (patrz odpowiedź cdespinosa), że sekcja GCC Preprocessing nie jest wyświetlana w ustawieniach kompilacji, ustaw Active SDK jako ten, który mówi (Base SDK) za nim, a ta sekcja pojawi się. Możesz to zrobić, wybierając z menu Project> Set Active Target> XXX (Base SDK). W różnych wersjach XCode (Base SDK) może się różnić, np. (Project Setting lub Project Default).

Gdy pojawi się ta sekcja, możesz dodać definicje do makr procesora, zamiast tworzyć ustawienie zdefiniowane przez użytkownika.

Mark24x7
źródło
1

Dla projektu Xcode 9.4.1 i C ++. Dodawanie const char*makr preprocesora do kompilacji debugowania i wydania .

  1. Wybierz swój projekt

    wybierz projekt

  2. Wybierz Ustawienia kompilacji

    wybierz ustawienia kompilacji

  3. Wyszukaj „ Makra preprocesora

    szukaj1 szukaj2

  4. Otwórz listę interaktywną

    otwórz listę interaktywną

  5. Dodaj swoje makra i nie zapomnij zmienić cudzysłowu

    dodaj ścieżkę

  6. Użyj w kodzie źródłowym jako powszechne 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");
    ...
Petr Javorik
źródło
0

Możesz zduplikować cel, który ma sekcję przetwarzania wstępnego, zmienić jego nazwę na dowolną, a następnie zmienić wartość makra Preprocessor.

kslcam
źródło