101 votes

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 but 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 spécial dans certains projets. Comme ce qui suit, mais avec mes propres symboles.

#if TARGET_IPHONE_SIMULATOR
    ...
#endif

0 votes

116voto

Ben Gottlieb Points 59900

Accédez aux paramètres de votre cible ou de votre projet, cliquez sur l'icône en forme 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.

D'après les commentaires de Steph, la syntaxe complète est :

constant_1=VALUE constant_2=VALUE

Notez que vous ne devez pas besoin de les '=' si vous voulez juste #définir un symbole, plutôt que de lui donner une valeur (pour les #ifdef déclarations)

86voto

cdespinosa Points 14277

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

Que faire si cette section est absente des paramètres de construction ?

3 votes

Faites ce que Ben Gotliebb suggère. Mais à partir de la version 3.2.4 de Xcode, "Preprocessor Macros" correspond à GCC_PREPROCESSOR_DEFINITIONS. Vous ne pouvez pas définir par l'utilisateur quelque chose qui est déjà disponible.

41voto

Hank Points 1823

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

Dans Build Settings -> Preprocessor Macros, et oui les backslashes sont critiques dans la définition :

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

Et dans le code source :

objectManager.client.baseURL = APPURL_NSString;

0 votes

Merci pour cette solution, j'ai cherché quelque chose EXACTEMENT comme ça, mais stack overflow est plein de solutions trop compliquées.

5voto

chunkyguy Points 1146

Vous pouvez utiliser le *_Prefix.pch pour déclarer les macros du projet. Ce fichier se trouve généralement dans votre Autres sources groupe.

3voto

hEADcRASH Points 119

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

...cependant, je n'arrive 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'avoir ajouté comme valeur :

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

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

...n'est jamais imprimé/appelé. Ça me rend dingue...

10 votes

Au lieu de #if DEBUG, essayez #if defined(DEBUG) ou #ifdef DEBUG

0 votes

Bizarrement, je me suis retrouvé ici en 2019, avec Swift et Xcode 10.3. Toute personne ayant le même problème que celui décrit ci-dessus pourrait trouver cela utile ; cela a certainement apporté mon #if DEBUG à la vie :) stackoverflow.com/a/47395485/2778502

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X