Inclure un # dans un define

07:58 modifié dans API AppKit #1
Bonjour,

Serait-il possible par magie d'inclure un # dans un define pour avoir une ligne de type :
#define toto #ifdef popo { machin; ...

Merci et bonne vacances

Réponses

  • BruBru Membre
    07:58 modifié #2
    Ben... Ce que tu as fait marche... Non ?

    .
  • 07:58 modifié #3
    Salut et bien non justement ou alors c'est le problème imaginaire ;)
  • BruBru Membre
    07:58 modifié #4
    En fait, le define #toto fonctionne bien, puisque dans le source intermédiaire (celui entre préprocesseur et compilateur), je retrouve bien "#ifdef popo { machin;" à  la place du "toto". Tu peux le vérifier dans Xcode, en cliquant-droit sur ton fichier source puis en choisissant l'option "Preprocess". Le résultat du préprocesseur sera affiché...

    Par contre, le "#ifdef popo { machin;" ne sera bien sûr pas réinterprété par le préprocesseur (il n'est pas récursif). Donc au moment de la compilation, le "#ifdef popo { machin;" sera interprété comme du code C...

    .
  • AliGatorAliGator Membre, Modérateur
    07:58 modifié #5
    Hello,

    Il me semble en plus que # et ## sont des opérateurs pour le préprocesseur, pour concaténer des éléments dans les macros, genre :
    [tt]#define createName(prefix,N,suffix) prefix # name # suffix[/tt]
    Je ne sais plus trop la différence entre # et ##, mais bon. En tout cas ça peut aussi expliquer pourquoi mettre un # dans ton #define ne te donne pas le résultat escompté dans d'autres cas que celui expliqué par Bru.

    Si tu veux inclure un #ifdef dans un #define, fait plutôt :
    #ifdef popo<br />#define toto machin { ... }<br />#else<br />#define toto<br />#endif
    
    Et là  quand tu mettras "toto" dans ton code, au lieu que le préprocesseur remplace toujours toto par le "#ifdef popo machin { ..." comme tu l'avais espéré dans le cas que tu donnes en exemple, il va remplacer par "machin { ..." si popo est défini, et par rien sinon. Ce qui au niveau résultat final revient au même (mais en plus propre).

    C'est souvent utilisé pour des macros de trace par exemple :
    #ifdef DEBUG<br />#define TRACE(x) NSLog(@&quot;Une trace : %@&quot;,x)<br />#else<br />#define TRACE(x) /* ne fait rien */<br />#endif
    
  • 07:58 modifié #6
    Merci à  vous deux !
Connectez-vous ou Inscrivez-vous pour répondre.