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

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

Mon but est de créer un symbole disponible pour tous les fichiers, sans avoir à utiliser import / include, pour qu’un ensemble de classes communes puisse avoir un comportement particulier dans certains projets. Comme ci-dessous, mais avec mes propres symboles.

#if TARGET_IPHONE_SIMULATOR ... #endif 

Accédez aux parameters 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 du paramètre doit être GCC_PREPROCESSOR_DEFINITIONS et vous pouvez saisir vos définitions dans le champ de droite.

Les commentaires de Per Steph, la syntaxe complète est la suivante:

 constant_1=VALUE constant_2=VALUE 

Notez que vous n’avez pas besoin des ‘=’ si vous voulez juste #définir un symbole, plutôt que de lui donner une valeur (pour les instructions #ifdef )

Vous n’avez pas besoin de créer un paramètre défini par l’utilisateur. Le paramètre intégré “Macros du préprocesseur” fonctionne très bien. alt text 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 des macros de préprocesseur non utilisées dans les en-têtes précompilés, afin que les différences dans votre définition de macro ne déclenchent pas un ensemble supplémentaire inutile d’en-têtes précompilés.

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

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

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

Et dans le code source:

 objectManager.client.baseURL = APPURL_NSSsortingng; 

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

C’est sous “GCC 4.2 Preprocessing” (ou simplement mettre “prepro” dans le champ de recherche) …

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

J’ai mes configurations standard Debug et Release, et je veux définir DEBUG = 1 dans la configuration du débogage. Mais après l’avoir ajouté en tant que valeur:

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

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

… n’imprime / ne s’appelle jamais. Ça me rend fou…

En réponse au commentaire de Kevin Laity (voir la réponse de cdespinosa), concernant le fait que la section de pré-traitement de GCC ne figure pas dans vos parameters de construction, activez le SDK actif (Base SDK) après cette section. Vous pouvez le faire en choisissant le menu Projet> Définir la cible active> XXX (Base SDK). Dans différentes versions de XCode (Base SDK) peut-être différent, comme (Paramètre de projet ou Projet par défaut).

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

Pour projet Xcode 9.4.1 et C ++. Ajouter des macros de préprocesseur const char* 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 du 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. Utiliser dans le code source comme const char* commun 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"); ... 

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