DEFINE ensembles

DEFINE ensembles - C++ - Programmation

Marsh Posté le 17-05-2005 à 17:40:33    

Salut!
 
Voici mon pb:  
 
je defini plusieurs defines du type :
#define TOTO A1B2
#define TATA C3D4E5
 
mon but est ensuite de faire une chaine de caractère  "A1B2C3D4E5" dans le code, en utilisant TOTO TATA, mais le pb c'est que qd je fais printf("TOTO TATA" ); ben il ne me les remplace pas , c'est vrai que ça semble normal vu que ya des ""  :D , mais bon, ya pas une astuce qui existe par hasard?
 
je sais que je pourrais faire çà aussi define TOTO "A1B2" ,puis concatener les strings mais bon, c un peu lourd... j'aimerai éviter, pour l'instant je fais çà et j'ai un truc du style dans le code :
string str;
str += TOTO;
str += TATA;
 
au pire j'aimerai mettre tout sur la meme ligne mais comment?
 
 
merci d'avance
 
Phil
 

Reply

Marsh Posté le 17-05-2005 à 17:40:33   

Reply

Marsh Posté le 17-05-2005 à 18:26:42    

#define TOTO "A1B2"
#define TATA "C3D4E5"
 
 
TOTO TATA
 
le cpp passe et colle tout
 
et voilà
 
"A1B2C3D4E5"

Reply

Marsh Posté le 17-05-2005 à 18:49:32    

const


---------------
http://www.blastmanu.info
Reply

Marsh Posté le 17-05-2005 à 18:57:18    

#define TOTO 1234
#define TATA ABCD
#define TO_STRING(x) #x
 
const char * s = TO_STRING(TOTO##TATA);

Reply

Marsh Posté le 17-05-2005 à 19:06:44    

Lam's a écrit :

#define TOTO 1234
#define TATA ABCD
#define TO_STRING(x) #x
 
const char * s = TO_STRING(TOTO##TATA);


 
ou TO_STRING(TOTO) TO_STRING(TATA);
plutôt
 
Je préfère la méthode de Taz


Message édité par jesus_christ le 17-05-2005 à 19:07:37
Reply

Marsh Posté le 17-05-2005 à 19:14:19    

jesus_christ a écrit :

ou TO_STRING(TOTO) TO_STRING(TATA);
plutôt
 
Je préfère la méthode de Taz


Yup, mais il est parfois nécessaire de faire un bon vieux:
   TOTO##TATA = TO_STRING(TOTO##TATA);
équivalent à:
  TOTO##TATA = TO_STRING(TOTO) TO_STRING(TATA); // perso, j'aime pas trop cette écriture.
Et évidemment, la méthode de Taz ne marche alors pas puisqu'elle est basée sur des chaînes. Ceci-dit, mis à part pour faire de l'introspection, de la génération de code très alambiqué, ou ce genre de choses là, c'est rare qu'on ait besoin du préprocesseur comme ça. Donc j'étais parti sur ce principe là...

Reply

Marsh Posté le 17-05-2005 à 19:18:53    

c'est vrai qu'en C++ :
 
const std::string TOTO = "1234";
const std::string TATA = "ABCD";
 
std::cout << (TOTO + TATA) << '\n';
 
ça me parait plus propre. Cela dit l'operateur ## permet de faire des trucs assez puissants.
Non Taz, ne me dit pas que ## n'est pas un operateur du C++, je sais et tout le monde s'en fout :D

Reply

Marsh Posté le 17-05-2005 à 23:17:37    

jesus_christ a écrit :

[...]
const std::string TOTO = "1234";
const std::string TATA = "ABCD";
 
std::cout << (TOTO + TATA) << '\n';
 
[...]


 
 :sweat:  
 
Les compilos optimisent ce genre de trucs... ?

Reply

Marsh Posté le 17-05-2005 à 23:54:34    

non, et j'en vois pas le besoin

Reply

Marsh Posté le 18-05-2005 à 00:57:47    

jesus_christ a écrit :

ça me parait plus propre. Cela dit l'operateur ## permet de faire des trucs assez puissants.
Non Taz, ne me dit pas que ## n'est pas un operateur du C++, je sais et tout le monde s'en fout :D


 
Je ne connaissais pas cet opérateur...
 
On l'utilise dans quels autres cas?

Reply

Marsh Posté le 18-05-2005 à 00:57:47   

Reply

Marsh Posté le 18-05-2005 à 09:04:37    

L'intérêt d'utiliser la syntaxe C++ (ie pas de #define) c'est que le code est debuggable!
 
D'ailleurs dans les ouvrages "d'expert", il est toujours recommandé de ne pas utiliser les #define pour définir des constantes.
 
Cela ne veut pas dire qu'il ne faut pas utiliser les #define mais que son usage est réservé à des cas d'utilisation particuliers.
 
A savoir: quand tu fait #define MA_CONSTANTE = "Ma constante"
 
string toto = MA_CONSTANTE;
 
en fait le précompilateur remplace MA_CONSTANTE par "Ma constante" (donc strictement impossible a debuggé)


---------------
Touche pas à mon code!
Reply

Marsh Posté le 18-05-2005 à 09:31:24    

Lam's a écrit :

#define TOTO 1234
#define TATA ABCD
#define TO_STRING(x) #x
 
const char * s = TO_STRING(TOTO##TATA);


 
T'es sur que ca marche ca ?
 
Ca m'imprime TOTOTATA...

Reply

Marsh Posté le 18-05-2005 à 09:48:38    

merci :), je pensais qu'il me balancerai une syntax error en faisant TOTO TATA , mais en fait ça marche c'est cool :)
"A1B2""C3D4" c equivalent à "A1B2C3D4", c même pas lors du remplacement des define qu'il vire les guillemets, mais à la compil donc. J'ai bon ?

Reply

Marsh Posté le 18-05-2005 à 19:33:24    

c'est le préprocesseur qui fait ça il me semble (Taz ?)
 
le préprocesseur il s'occupe de :
 
- les commentaires
- les #machin (#include, #if...)
- les backslash en fin de ligne
- les concaténations de string "bon" "jour" -> "bonjour"
- les constantes __LINE__, __FILE__...


Message édité par jesus_christ le 18-05-2005 à 19:34:07
Reply

Marsh Posté le 18-05-2005 à 19:39:30    

jesus_christ a écrit :


- les concaténations de string "bon" "jour" -> "bonjour"


 
ben ca fait quoi

echo "bon" "jour" | cpp


?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed