Come definire un simbolo del preprocessore in Xcode


100

È possibile impostare un simbolo per la compilazione condizionale impostando le proprietà in un progetto Xcode?

Il mio scopo è creare un simbolo che sia disponibile per tutti i file, senza dover usare import / include, in modo che un insieme di classi comuni possa avere un comportamento speciale in alcuni progetti. Come il seguente, ma con i miei simboli.

#if TARGET_IPHONE_SIMULATOR
    ...
#endif

Risposte:


116

Vai alle impostazioni di destinazione o progetto, fai clic sull'icona a forma di ingranaggio in basso a sinistra e seleziona "Aggiungi impostazione definita dall'utente". Il nome della nuova impostazione dovrebbe essere GCC_PREPROCESSOR_DEFINITIONSe puoi digitare le tue definizioni nel campo a destra.

Secondo i commenti di Steph, la sintassi completa è:

constant_1=VALUE constant_2=VALUE

Nota che non hai bisogno di '=' se vuoi solo #definire un simbolo, piuttosto che dargli un valore (per le #ifdefistruzioni)


2
Grazie! A chi fosse interessato, la sintassi appare come "kVarOne = 5 myVar = 3.0" (senza virgolette), l'ho trovata per tentativi ed errori. Ben potresti modificare la tua risposta per specificarlo? Grazie ancora.
Steph Thirion,

1
Risposta incredibile. Ho ancora i capelli per questo. Grazie, grazie, grazie. +1 (Vorrei che fosse di più)
Ali Parr

11
Cordiali saluti, a partire da Xcode 3.2.4, "Macro del preprocessore" è mappato a GCC_PREPROCESSOR_DEFINITIONS e Xcode non ti consentirà più di eseguire una definizione dell'utente (poiché è già disponibile).
Clay Bridges,

11
Questa non è più un'icona a forma di ingranaggio in basso a sinistra, ma invece un'icona più in basso a destra (della scheda Impostazioni di costruzione del tuo obiettivo).
Jesse Smith

1
dovresti aggiornare questa risposta. non c'è più l'icona dell'ingranaggio
Radu Simionescu

86

Non è necessario creare un'impostazione definita dall'utente. L'impostazione incorporata "Macro del preprocessore" funziona perfettamente. testo alternativo http://idisk.mac.com/cdespinosa/Public/Picture%204.png

Se si dispone di più destinazioni o progetti che utilizzano lo stesso file di prefisso, utilizzare invece Macro preprocessore non utilizzate nelle intestazioni precompilate, in modo che le differenze nella definizione della macro non attivino un set aggiuntivo non necessario di intestazioni precompilate.


1
Cosa fai se questa sezione non è presente nelle impostazioni di compilazione?
Kevin Laity

3
Fai quello che suggerisce Ben Gotliebb. Ma a partire dalla versione 3.2.4 di Xcode, "Preprocessor Macro" è mappato a GCC_PREPROCESSOR_DEFINITIONS. Non è possibile definire qualcosa di già disponibile dall'utente.
Clay Bridges,

41

In aggiunta, se stai usando questa tecnica per definire le stringhe nel tuo target, ecco come ho dovuto definirle e usarle:

In Build Settings -> Preprocessor Macro, e sì i backslash sono fondamentali nella definizione:

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

E nel codice sorgente:

objectManager.client.baseURL = APPURL_NSString;

Grazie per questa soluzione, ho cercato qualcosa ESATTAMENTE come questo, ma lo stack overflow è pieno di soluzioni complicate.
David P

5

È possibile utilizzare il *_Prefix.pchfile per dichiarare macro a livello di progetto. Quel file è di solito nel tuo gruppo Altre fonti .


3

È sotto "GCC 4.2 Preprocessing" (o semplicemente metti "prepro" nella casella di ricerca) ...

... tuttavia, per la vita di me non riesco a farlo funzionare.

Ho le mie configurazioni di debug e rilascio standard e desidero definire DEBUG = 1 nella configurazione di debug. Ma dopo averlo aggiunto come valore:

(nella finestra delle impostazioni)> Macro del preprocessore: DEBUG = 1

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

... non stampa mai / viene chiamato. Mi sta facendo impazzire...


10
Invece di #if DEBUG, prova #if defined (DEBUG) o #ifdef DEBUG
Simo Salminen

Stranamente, mi sono ritrovato qui nel 2019, con Swift e Xcode 10.3. Chiunque abbia lo stesso problema descritto sopra potrebbe trovarlo utile; sicuramente mi ha portato #if DEBUGin vita :) stackoverflow.com/a/47395485/2778502
jeff-h

1

In risposta al commento di Kevin Laity (vedi la risposta di cdespinosa), sulla sezione Preelaborazione GCC che non viene visualizzata nelle impostazioni di build, rendi l'Active SDK quello che dice (Base SDK) dopo di esso e questa sezione apparirà. Puoi farlo scegliendo il menu Progetto> Imposta destinazione attiva> XXX (SDK di base). In diverse versioni di XCode (Base SDK) potrebbe essere diverso, come (Project Setting o Project Default).

Dopo aver visualizzato questa sezione, è possibile aggiungere le definizioni alle Macro del processore invece di creare un'impostazione definita dall'utente.


1

Per Xcode 9.4.1 e progetto C ++. Aggiunta di const char*macro del preprocessore alle build di debug e di rilascio .

  1. Seleziona il tuo progetto

    seleziona progetto

  2. Seleziona Impostazioni build

    selezionare le impostazioni di build

  3. Cerca " Macro del preprocessore "

    search1 Search2

  4. Apri elenco interattivo

    apri l'elenco interattivo

  5. Aggiungi le tue macro e non dimenticare di sfuggire alla citazione

    aggiungi percorso

  6. Utilizzare nel codice sorgente come comune 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

È possibile duplicare la destinazione che ha la sezione di preelaborazione, rinominarla con il nome desiderato e quindi modificare il valore della macro del preprocessore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.