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 disponible pour tous les fichiers, sans avoir à utiliser import/include, afin qu'un ensemble de classes communes puisse avoir un comportement spécial dans certains projets. Comme ci-dessous, mais avec mes propres symboles.
#if TARGET_IPHONE_SIMULATOR
...
#endif
Allez dans les 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 du 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 la suivante:
constant_1=VALUE constant_2=VALUE
Notez que vous ne le faites pas avoir besoin les '=' si vous voulez juste # définir un symbole, plutôt que de lui donner une valeur (pour #ifdef
déclarations)
Vous n'avez pas besoin de créer un paramètre défini par l'utilisateur. Le paramètre intégré "Macros de préprocesseur" fonctionne parfaitement. alt text http://idisk.mac.com/cdespinosa/Public/Picture%204.png
Si plusieurs cibles ou projets 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. Ainsi, 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.
En addenda, 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 Paramètres de construction -> Macros de préprocesseur, et oui, des barres obliques inverses sont essentielles dans la définition:
APPURL_NSString=\@\"www.foobar.org\"
Et dans le code source:
objectManager.client.baseURL = APPURL_NSString;
Vous pouvez utiliser le *_Prefix.pch
fichier pour déclarer les macros du projet. Ce fichier est généralement dans votre groupe Autres sources.
C'est sous "GCC 4.2 Preprocessing" (ou simplement "prepro" dans le champ de recherche) ...
... Cependant, pour ma vie, 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 de débogage. Mais après l'ajout en tant que valeur:
(dans la fenêtre de configuration)> Macros de préprocesseur: DEBUG = 1
#if DEBUG
printf("DEBUG is set!");
#endif
... n'imprime jamais/ne s'appelle pas. Ça me rend fou...
En réponse au commentaire de Kevin Laity (voir la réponse de cdespinosa) sur le fait que la section de prétraitement GCC ne figure pas dans vos paramètres de construction, définissez Active SDK comme celui qui dit (Base SDK) 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 (Base SDK), il peut être différent, comme (Paramètre de projet ou Projet par défaut).
Une fois que cette section apparaît, vous pouvez ajouter vos définitions aux macros de processeur au lieu de créer un paramètre défini par l'utilisateur.
Pour Xcode 9.4.1 et projet C++. Ajouter const char*
Macros de préprocesseur dans les deux versions Débogage et Version.
Sélectionnez votre projet
Sélectionnez Build Settings
Recherchez " Macros de préprocesseur"
Ouvrir la liste interactive
Ajoutez vos macros et n'oubliez pas d'échapper à la citation
Utiliser dans le code source en tant que 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 comportant la section de prétraitement, la renommer sous le nom de votre choix, puis changer la valeur de votre macro de préprocesseur.