So definieren Sie ein Präprozessorsymbol in Xcode

100

Ist es möglich, ein Symbol für die bedingte Kompilierung festzulegen, indem Eigenschaften in einem Xcode-Projekt eingerichtet werden?

Mein Ziel ist es, ein Symbol zu erstellen, das für alle Dateien verfügbar ist, ohne import / include verwenden zu müssen, damit eine Reihe allgemeiner Klassen in einigen Projekten ein besonderes Verhalten aufweisen kann. Wie das Folgende, aber mit meinen eigenen Symbolen.

#if TARGET_IPHONE_SIMULATOR
    ...
#endif
Steph Thirion
quelle

Antworten:

116

Gehen Sie zu Ihren Ziel- oder Projekteinstellungen, klicken Sie unten links auf das Zahnradsymbol und wählen Sie "Benutzerdefinierte Einstellungen hinzufügen". Der neue Einstellungsname sollte lauten GCC_PREPROCESSOR_DEFINITIONS, und Sie können Ihre Definitionen in das rechte Feld eingeben.

Laut Stephs Kommentaren lautet die vollständige Syntax:

constant_1=VALUE constant_2=VALUE

Beachten Sie, dass Sie die '=' nicht benötigen , wenn Sie nur ein Symbol # definieren möchten, anstatt ihm einen Wert zu geben (für #ifdefAnweisungen).

Ben Gottlieb
quelle
2
Vielen Dank! Für alle Interessierten sieht die Syntax wie "kVarOne = 5 myVar = 3.0" aus (ohne Anführungszeichen). Ich habe sie durch Ausprobieren gefunden. Ben, könntest du deine Antwort bearbeiten, um das anzugeben? Danke noch einmal.
Steph Thirion
1
Erstaunliche Antwort. Aus diesem Grund habe ich immer noch Haare. Danke danke danke. +1 (ich wünschte, es könnte mehr sein)
Ali Parr
11
Zu Ihrer Information: Ab Xcode 3.2.4 werden "Präprozessor-Makros" GCC_PREPROCESSOR_DEFINITIONS zugeordnet, und mit Xcode können Sie keine Benutzerdefinitionen mehr vornehmen (da diese bereits verfügbar sind).
Clay Bridges
11
Dies ist nicht länger ein Zahnradsymbol unten links, sondern ein Plus-Symbol unten rechts (auf der Registerkarte Build-Einstellungen Ihres Ziels).
Jesse Smith
1
Sie sollten diese Antwort aktualisieren. Es gibt kein Zahnradsymbol mehr
Radu Simionescu
86

Sie müssen keine benutzerdefinierte Einstellung erstellen. Die eingebaute Einstellung "Präprozessor-Makros" funktioniert einwandfrei. Alternativtext http://idisk.mac.com/cdespinosa/Public/Picture%204.png

Wenn Sie mehrere Ziele oder Projekte haben, die dieselbe Präfixdatei verwenden, verwenden Sie stattdessen Präprozessor-Makros, die nicht in vorkompilierten Headern verwendet werden, damit Unterschiede in Ihrer Makrodefinition keinen unnötigen zusätzlichen Satz vorkompilierter Header auslösen.

cdespinosa
quelle
1
Was tun Sie, wenn dieser Abschnitt in den Build-Einstellungen fehlt?
Kevin
3
Mach was Ben Gotliebb vorschlägt. Ab Version 3.2.4 von Xcode werden "Präprozessor-Makros" jedoch GCC_PREPROCESSOR_DEFINITIONS zugeordnet. Sie können nicht etwas definieren, das bereits verfügbar ist.
Clay Bridges
41

Wenn Sie diese Technik verwenden, um Zeichenfolgen in Ihrem Ziel zu definieren, musste ich sie wie folgt definieren und verwenden:

In den Build-Einstellungen -> Präprozessor-Makros und Ja sind Backslashes in der Definition von entscheidender Bedeutung:

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

Und im Quellcode:

objectManager.client.baseURL = APPURL_NSString;
Stickley
quelle
Vielen Dank für diese Lösung, die genau nach so etwas gesucht hat, aber der Stapelüberlauf ist voller überkomplizierter Lösungen.
David P
5

Mit der *_Prefix.pchDatei können Sie projektweite Makros deklarieren. Diese Datei befindet sich normalerweise in Ihrer Gruppe Andere Quellen .

Chunkyguy
quelle
3

Es ist unter "GCC 4.2 Preprocessing" (oder setzen Sie einfach "prepro" in das Suchfeld) ...

... aber für mein Leben kann ich es nicht zum Laufen bringen.

Ich habe meine Standard-Debug- und Release-Konfigurationen und möchte DEBUG = 1 in der Debugging-Konfiguration definieren. Aber nachdem Sie es als Wert hinzugefügt haben:

(im Einstellungsfenster)> Präprozessor-Makros: DEBUG = 1

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

... druckt nie / wird gerufen. Es macht mich verrückt...

Head-Crash
quelle
10
Anstelle von #if DEBUG versuchen Sie #if defined (DEBUG) oder #ifdef DEBUG
Simo Salminen
Seltsamerweise befand ich mich 2019 mit Swift und Xcode 10.3 hier. Jeder mit dem oben beschriebenen Problem kann dies hilfreich finden. es hat mich #if DEBUGauf jeden Fall
jeff-h
1

Als Antwort auf den Kommentar von Kevin Laity (siehe Antwort von cdespinosa) zum Abschnitt "GCC-Vorverarbeitung", der in Ihren Build-Einstellungen nicht angezeigt wird, machen Sie das Active SDK zu dem Abschnitt, der danach (Base SDK) anzeigt, und dieser Abschnitt wird angezeigt. Sie können dies tun, indem Sie das Menü Projekt> Aktives Ziel festlegen> XXX (Basis-SDK) wählen. In verschiedenen Versionen von XCode (Basis-SDK) kann es sein, dass sie unterschiedlich sind, z. B. (Projekteinstellung oder Projektstandard).

Nachdem dieser Abschnitt angezeigt wurde, können Sie Ihre Definitionen zu Prozessormakros hinzufügen, anstatt eine benutzerdefinierte Einstellung zu erstellen.

Mark24x7
quelle
1

Für Xcode 9.4.1 und C ++ Projekt. Hinzufügen von const char*Präprozessor-Makros zu Debug- und Release- Builds.

  1. Wählen Sie Ihr Projekt aus

    Projekt auswählen

  2. Wählen Sie Build Settings

    Build-Einstellungen auswählen

  3. Suche nach " Präprozessor-Makros "

    search1 search2

  4. Interaktive Liste öffnen

    interaktive Liste öffnen

  5. Fügen Sie Ihre Makros hinzu und vergessen Sie nicht, sich dem Angebot zu entziehen

    Pfad hinzufügen

  6. Verwendung im Quellcode als üblich 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
quelle
0

Sie können das Ziel mit dem Vorverarbeitungsabschnitt duplizieren, es in einen beliebigen Namen umbenennen und dann Ihren Präprozessor-Makrowert ändern.

kslcam
quelle