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

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)


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.


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;

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 .


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...


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.


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");
    ...

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.