web-dev-qa-db-fra.com

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

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
95
Steph Thirion

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)

113
Ben Gottlieb

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.

86
cdespinosa

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;
41
Stickley

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.

5
chunkyguy

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

3
hEADcRASH

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.

1
Mark24x7

Pour Xcode 9.4.1 et projet C++. Ajouter const char* Macros de préprocesseur dans les deux versions Débogage et Version.

  1. Sélectionnez votre projet

    select project

  2. Sélectionnez Build Settings

    select build settings

  3. Recherchez " Macros de préprocesseur"

    search1search2

  4. Ouvrir la liste interactive

    open interactive list

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

    add path

  6. 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");
    ...
    
1
Petr Javorik

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.

0
kslcam