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...
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 :
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(@"Une trace : %@",x)<br />#else<br />#define TRACE(x) /* ne fait rien */<br />#endif
Réponses
.
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...
.
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 : 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 :