Compiler des bouts de code OS X ou iOS dans les classes communes

muqaddarmuqaddar Administrateur
octobre 2012 modifié dans Objective-C, Swift, C, C++ #1
Salut,



Pour partager des classes entre iOS et Mac, quelle est la technique la plus simple pour compiler des bouts de code pour l'un ou l'autre ?



J'avais ajouté un Preprocessor Macro "MAC" dans mon target, mais je ne trouve pas ceux qui existent déjà .


#ifndef MAC<br />
Code pour iOS<br />
#endif




Quelles sont vos astuces, les choses à  faire ou ne pas faire ?

Réponses

  • AliGatorAliGator Membre, Modérateur
    octobre 2012 modifié #2
    Les macros sont déjà  définies dans [font=courier new,courier,monospace]${SDKROOT}/usr/include/TargetConditionals.h[/font]



    Voilà  leur noms, et elles sont affectées à  0 ou 1 selon la plateforme cible à  la compilation.
    #define TARGET_OS_MAC<br />
    #define TARGET_OS_WIN32<br />
    #define TARGET_OS_UNIX<br />
    #define TARGET_OS_EMBEDDED<br />
    #define TARGET_OS_IPHONE<br />
    #define TARGET_IPHONE_SIMULATOR
    
  • muqaddarmuqaddar Administrateur
    octobre 2012 modifié #3
    Bizarre.



    J'avais essayé TARGET_OS_MAC tout à  l'heure sans succès.

    Pas de problème avec maintenant.


    <br />
    #ifndef TARGET_OS_MAC<br />
    	[parameters setValue:[[UIDevice currentDevice] model] forKey:@&quot;user[app]&quot;];<br />
    #endif<br />
    




    Merci.
  • muqaddarmuqaddar Administrateur
    Ils n'ont toujours pas changé #define TARGET_OS_IPHONE pour #define TARGET_OS_IOS ?
  • CéroceCéroce Membre, Modérateur
    Heureusement que non, t'imagines si tu dois rectifier tous les makefiles parce qu'Apple a changé le nom de son OS.
  • muqaddarmuqaddar Administrateur
    'Céroce' a écrit:


    Heureusement que non, t'imagines si tu dois rectifier tous les makefiles parce qu'Apple a changé le nom de son OS.




    ça ne pourrait pas au moins s'ajouter en plus ?
  • AliGatorAliGator Membre, Modérateur
    Ils auraient pu faire #define TARGET_OS_IOS TARGET_OS_IPHONE c'est vrai... mais bon c'est pas un drame image/wink.png' class='bbc_emoticon' alt=';)' />
  • muqaddarmuqaddar Administrateur
    octobre 2012 modifié #8
    Dans mon projet MAC, je viens de me rendre compte que TARGET_OS_IPHONE n'est pas reconnu. Quelle est donc la bonne procédure si je ne veux pas faire #ifndef TARGET_OS_MAC ?
  • CéroceCéroce Membre, Modérateur
    octobre 2012 modifié #9
    C'est ce à  quoi on s'attend, non ? Que seule TARGET_OS_MAC soit définie.



    Edit: En fait, par rapport au .h, effectivement c'est bizarre, puisque ce sont bien des valeurs 0 ou 1 qui sont affectées, ce n'est pas seulement le symbole qui est défini.
  • AliGatorAliGator Membre, Modérateur
    En même temps il suffisait d'aller dans le header que je t'ai cité pour le voir aussi image/biggrin.png' class='bbc_emoticon' alt=':D' />
  • muqaddarmuqaddar Administrateur
    'AliGator' a écrit:


    En même temps il suffisait d'aller dans le header que je t'ai cité pour le voir aussi image/biggrin.png' class='bbc_emoticon' alt=':D' />




    TARGET_OS_MAC est toujours à  1 donc ce n'est pas ce qu'il me faut.
  • AliGatorAliGator Membre, Modérateur
    'muqaddar' a écrit:


    TARGET_OS_MAC est toujours à  1 donc ce n'est pas ce qu'il me faut.
    J'ai jamais dit que c'était ce qu'il te fallait, c'est toi qui a extrapolé image/biggrin.png' class='bbc_emoticon' alt=':D' />



    Moi j'ai juste dit que les #define existait et que leur valeur dépendait de la plateforme cible image/tongue.png' class='bbc_emoticon' alt=':P' />
  • muqaddarmuqaddar Administrateur
    Je suis désolé, mais je ne trouve pas de solution brillante.

    En gros, il faut faire:





    #if TARGET_OS_IPHONE


    // code iOS


    #else


    // code Mac


    #endif




    C'est moche. Ou alors, je n'ai pas compris.
  • AliGatorAliGator Membre, Modérateur
    'muqaddar' a écrit:


    C'est moche. Ou alors, je n'ai pas compris.
    Je comprend pas, en quoi c'est plus moche que ce que tu essayais de faire avant avec tes propres macros, à  savoir
    #ifndef MAC<br />
    // Code pour iOS<br />
    #else<br />
    // Code pour Mac<br />
    #endif
    
    C'est quoi la différence, à  part le nom de la constante qui change ? Pourquoi ça te parais + moche dans un cas que dans l'autre ?!
  • muqaddarmuqaddar Administrateur
    octobre 2012 modifié #16
    Ma façon de faire serait plutôt:


    #ifdef TARGET_OSX<br />
    // code OS X<br />
    #endif<br />
    <br />
    #ifdef TARGET_IOS<br />
    // code iOS<br />
    #endif
    






    Déjà , je préfère ça à  un if...else. On voit mieux dans quel bloc on est tout de suite. Cele est une préférence personnelle pour la lisibilité. (utile si le bloc de code est assez long)

    Et puis on sait jamais, si Apple sort un 3è OS... ;-)



    Ensuite, je trouve nul que TARGET_OS_MAC soir à  1 sur iOS, même si je le conçois.

    Ou encore que je doive me servir de TARGET_OS_IPHONE, même pour l'iPad.



    Cela me fait 3 raisons. image/smile.png' class='bbc_emoticon' alt=':)' />



    Je peux éventuellement faire ça apparemment:


    #if TARGET_OS_IPHONE<br />
      #define TARGET_IOS<br />
    #else<br />
      #define TARGET_OSX<br />
    #endif
    




    Ce qui me permet d'utiliser mes 2 macros plus parlantes par la suite.
  • VinoMac en approche ?
  • muqaddarmuqaddar Administrateur
    'Draken' a écrit:


    VinoMac en approche ?




    Non, je fais juste quelques tests. Je retouche un peu à  la prog Mac après la discussion que nous avons eu la semaine dernière dans un autre sujet... image/smile.png' class='bbc_emoticon' alt=':)' />
Connectez-vous ou Inscrivez-vous pour répondre.