Choisir une constante en fonction d'une autre

muqaddarmuqaddar Administrateur
septembre 2010 modifié dans Objective-C, Swift, C, C++ #1
J'adore ce titre.  :o

Bon, je vous explique.

J'ai 2 constantes d'URL :

#define kURL_LOCAL&nbsp; @&quot;http://0.0.0.0:3000&quot;<br />#define kURL_PROD	 @&quot;http://www.vinocella.net&quot;


Je voudrais que ces constantes soient remplacées dans mon code (à  plusieurs endroits) par une variable ou une fonction ou j'en sais rien... qui irait donc chercher la bonne constante en fonction du contexte.

Le contexte n'est pas simulateur ou device (chose qu'on peut gérer avec une macro) car je peux avoir envie de tester sur le serveur de prod même sur le simulateur.

Donc en gros il faudrait dans prefix.pch que je mette :

#define kUSE_PROD_URL FALSE ou TRUE


et qu'en fonction de ça, ça aille me chercher la bonne constante, par exemple :

if (kUSE_URL_PROD == FALSE) kURL = kURL_LOCAL;


et que ceci soit accessible dans toutes les classes... alors macro ou autre ?


Réponses

  • muqaddarmuqaddar Administrateur
    19:27 modifié #2
    Bon, je viens de faire une découverte.

    Je ne savais pas qu'on pouvait définir une constante avec une autre...

    #define kURL_LOCAL @&quot;http://0.0.0.0:3000&quot;<br />#define kURL_PROD @&quot;http://www.vinocella.net&quot;<br />#define kUSE_URL kURL_LOCAL
    


    Problème réglé.  :P
  • CéroceCéroce Membre, Modérateur
    19:27 modifié #3
    Tu disposes des macro conditionnelles #ifdef, #ifndef, #elif et #else

    #ifdef LOCAL_TEST<br />#define SITE_URL	@&quot;http://0.0.0.0:3000&quot;<br />#else<br />#define SITE_URL	@&quot;http://www.vinocella.net&quot;<br />#endif
    


    Par contre, je ne sais pas comment définir LOCAL_TEST pour le compilateur (je ne l'ai jamais fait sous XCode), mais ça se trouve a priori dans les options de compil de la cible.
  • muqaddarmuqaddar Administrateur
    19:27 modifié #4
    Ta solution est pas mal aussi, mais il faut définir LOCAL_TEST en fonction du target... sauf que je veux choisir arbitrairement d'être en prod ou pas... et pas en fonction d'un contexte.
  • AliGatorAliGator Membre, Modérateur
    19:27 modifié #5
    Bah si tu fais un [tt]#define kUSE_PROD_URL 1[/tt] pourquoi ne pas faire une macro avec une valeur définie conditionnellement ?
    #if kUSE_PROD_URL<br />#define kURL kURL_PROD<br />#else<br />#define kURL kURL_LOCAL<br />#endif
    
    Tout simplement ?

    Arf grillé par Céroce.

    Mais en fait je ne comprends pas ce que tu définis par "en fonction d'un contexte", ce contexte serait à  définir comment ? au runtime ?
  • muqaddarmuqaddar Administrateur
    19:27 modifié #6
    dans 1285225988:

    Mais en fait je ne comprends pas ce que tu définis par "en fonction d'un contexte", ce contexte serait à  définir comment ? au runtime ?


    Le contexte, c'est moi ! :)
    Envie de tester en local ou en prod à  certains moments (et rien à  voir avec les modes debug, beta, ou release).
  • AliGatorAliGator Membre, Modérateur
    19:27 modifié #7
    Bah donc passer un #define de 0 à  1 manuellement te suffit, non ?
    Et donc avec un #if ensuite pour faire [tt]#define kURL kURL_LOCAL[/tt] dans un cas et [tt]#define kURL kURL_PROD[/tt] dans l'autre et ça roule ?
  • muqaddarmuqaddar Administrateur
    19:27 modifié #8
    Oui ça roule...

    #define kUSE_URL_PROD	0							<br /><br />#if kUSE_URL_PROD<br />#define kURL	@&quot;http://0.0.0.0:3000&quot;<br />#else<br />#define kURL	@&quot;http://www.vinocella.net&quot;<br />#endif
    


    Mais ma solution au post 2 aussi... et elle prends moins de lignes...

    Mais dans un soucis d'avoir la valeur 0 ou 1 à  changer ici, contre 5 caractères dans ma solution, j'adopte celle-ci.  :P
  • AliGatorAliGator Membre, Modérateur
    19:27 modifié #9
    Yep sauf que ça a tellement fusé en réponses ce matin que les posts se sont croisés je n'avais pas vu les réponses proposées :P
Connectez-vous ou Inscrivez-vous pour répondre.