DEFINE ensembles - C++ - Programmation
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"
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);
Marsh Posté le 17-05-2005 à 19:06:44
Lam's a écrit : #define TOTO 1234 |
ou TO_STRING(TOTO) TO_STRING(TATA);
plutôt
Je préfère la méthode de Taz
Marsh Posté le 17-05-2005 à 19:14:19
jesus_christ a écrit : ou TO_STRING(TOTO) TO_STRING(TATA); |
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à...
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
Marsh Posté le 17-05-2005 à 23:17:37
jesus_christ a écrit : [...] |
Les compilos optimisent ce genre de trucs... ?
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. |
Je ne connaissais pas cet opérateur...
On l'utilise dans quels autres cas?
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é)
Marsh Posté le 18-05-2005 à 09:31:24
Lam's a écrit : #define TOTO 1234 |
T'es sur que ca marche ca ?
Ca m'imprime TOTOTATA...
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 ?
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__...
Marsh Posté le 18-05-2005 à 19:39:30
jesus_christ a écrit : |
ben ca fait quoi
echo "bon" "jour" | cpp |
?
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 "" , 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