Comment définir un symbole de préprocesseur dans Xcode

100

Est-il possible de définir un symbole pour la compilation conditionnelle en définissant des propriétés dans un projet Xcode?

Mon objectif est de créer un symbole qui soit disponible pour tous les fichiers, sans avoir à utiliser import / include, afin qu'un ensemble de classes communes puisse avoir un comportement particulier dans certains projets. Comme ce qui suit, mais avec mes propres symboles.

#if TARGET_IPHONE_SIMULATOR
    ...
#endif
Steph Thirion
la source

Réponses:

116

Accédez aux paramètres de votre cible ou de votre projet, cliquez sur l'icône d'engrenage en bas à gauche et sélectionnez "Ajouter un paramètre défini par l'utilisateur". Le nouveau nom de paramètre doit être GCC_PREPROCESSOR_DEFINITIONS, et vous pouvez taper vos définitions dans le champ de droite.

Selon les commentaires de Steph, la syntaxe complète est:

constant_1=VALUE constant_2=VALUE

Notez que vous n'avez pas besoin des '=' si vous voulez juste #define un symbole, plutôt que de lui donner une valeur (pour les #ifdefinstructions)

Ben Gottlieb
la source
2
Merci! Pour quiconque est intéressé, la syntaxe ressemble à "kVarOne = 5 myVar = 3.0" (sans les guillemets), je l'ai trouvée par essais et erreurs. Ben pourriez-vous modifier votre réponse pour préciser cela? Merci encore.
Steph Thirion
1
Réponse incroyable. J'ai encore des cheveux à cause de ça. Merci merci merci. +1 (Je souhaite que ce soit plus)
Ali Parr
11
Pour info, à partir de Xcode 3.2.4, les "macros de préprocesseur" correspondent à GCC_PREPROCESSOR_DEFINITIONS, et Xcode ne vous laissera plus définir par l'utilisateur (car il est déjà disponible).
Clay Bridges
11
Il ne s'agit plus d'une icône d'engrenage en bas à gauche, mais plutôt d'une icône Plus en bas à droite (de l'onglet Paramètres de construction de votre cible).
Jesse Smith
1
vous devez mettre à jour cette réponse. il n'y a plus d'icône d'engrenage
Radu Simionescu
86

Vous n'avez pas besoin de créer un paramètre défini par l'utilisateur. Le paramètre intégré «Macros préprocesseur» fonctionne très bien. texte alternatif http://idisk.mac.com/cdespinosa/Public/Picture%204.png

Si vous avez plusieurs cibles ou projets qui utilisent le même fichier de préfixe, utilisez plutôt les macros de préprocesseur non utilisées dans les en-têtes précompilés, afin que les différences dans la définition de votre macro ne déclenchent pas un ensemble supplémentaire inutile d'en-têtes précompilés.

cdespinosa
la source
1
Que faites-vous si cette section est absente des paramètres de construction?
Kevin Laity
3
Faites ce que Ben Gotliebb suggère. Mais à partir de la version 3.2.4 de Xcode, "Macros de préprocesseur" correspond à GCC_PREPROCESSOR_DEFINITIONS. Vous ne pouvez pas définir par l'utilisateur quelque chose de déjà disponible.
Clay Bridges
41

En complément, si vous utilisez cette technique pour définir des chaînes dans votre cible, voici comment j'ai dû les définir et les utiliser:

Dans les paramètres de construction -> Macros de préprocesseur, et oui les barres obliques inverses sont essentielles dans la définition:

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

Et dans le code source:

objectManager.client.baseURL = APPURL_NSString;
Stickley
la source
Merci pour cette solution, j'ai recherché exactement quelque chose comme ça, mais le débordement de pile est plein de solutions trop compliquées.
David P
5

Vous pouvez utiliser le *_Prefix.pchfichier pour déclarer des macros à l'échelle du projet. Ce fichier se trouve généralement dans votre groupe Autres sources .

chunkyguy
la source
3

C'est sous "GCC 4.2 Preprocessing" (ou juste mettre "prepro" dans la boîte de recherche) ...

... cependant, pour la vie de moi, je ne peux pas le faire fonctionner.

J'ai mes configurations de débogage et de libération standard, et je veux définir DEBUG = 1 dans la configuration de débogage. Mais après l'avoir ajouté comme valeur:

(dans la fenêtre des paramètres)> Macros préprocesseur: DEBUG = 1

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

... n'imprime jamais / est appelé. Ça me rend fou...

HEADcRASH
la source
10
Au lieu de #if DEBUG, essayez #if defined (DEBUG) ou #ifdef DEBUG
Simo Salminen
Curieusement, je me suis retrouvé ici en 2019, avec Swift et Xcode 10.3. Toute personne ayant le même problème décrit ci-dessus pourrait trouver cela utile; cela m'a certainement donné #if DEBUGvie :) stackoverflow.com/a/47395485/2778502
jeff-h
1

En réponse au commentaire de Kevin Laity (voir la réponse de cdespinosa), à propos de la section Prétraitement GCC n'apparaissant pas dans vos paramètres de construction, définissez le SDK actif sur celui qui indique (SDK de base) après cela et cette section apparaîtra. Vous pouvez le faire en choisissant le menu Projet> Définir la cible active> XXX (SDK de base). Dans différentes versions de XCode (SDK de base) peut être différent, comme (Paramètres du projet ou par défaut du projet).

Une fois que cette section apparaît, vous pouvez ajouter vos définitions aux macros de processeur plutôt que de créer un paramètre défini par l'utilisateur.

Mark24x7
la source
1

Pour Xcode 9.4.1 et projet C ++. Ajout de const char*macros de préprocesseur aux versions Debug et Release .

  1. Sélectionnez votre projet

    sélectionner un projet

  2. Sélectionnez Paramètres de construction

    sélectionnez les paramètres de construction

  3. Rechercher " Macros de préprocesseur "

    recherche1 recherche2

  4. Ouvrir la liste interactive

    ouvrir la liste interactive

  5. Ajoutez vos macros et n'oubliez pas d'échapper à la citation

    ajouter un chemin

  6. Utilisation courante dans le code source 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
la source
0

Vous pouvez dupliquer la cible qui a la section de prétraitement, la renommer en n'importe quel nom souhaité, puis modifier la valeur de votre macro de préprocesseur.

kslcam
la source