faire des macros avec l'operateur << windows et linux

faire des macros avec l'operateur << windows et linux - C++ - Programmation

Marsh Posté le 05-12-2008 à 15:38:58    

J'ai porté un projet de Windows vers Linux, et j'ai du corriger la syntaxe de certaines macro, que gcc me refusait. Dans la version qui marchait bien sous Windows, j'utilisais la syntaxe ##  pour mes stream...
Maintenant, je suis repassé en une syntaxe en # pour que ca compile sous Linux, et evidemment, ca ne donne pas le résultat attendu (sous win comme sous lin), ca affichage des  
 
L"Mode verbeux activÙ - RÙsumÙ des paramÙtres retenus :"
 
Mis à part l'unicode qui a l'air de ne pas marcher, c'est surtout le L"" qui m'embête...
Quand j'étais encore  avec ##, ça affichait bien le message. Voici le code :
 
Macros définies actuellement compatibles Windows (vc) et Linux(gcc):

Code :
  1. #define CRASH(stream) { std::wcerr << #stream << std::endl; }
  2. #define WARNING(stream) \
  3. if(!cmd_quiet) \
  4.  { std::wcout << #stream << std::endl; }
  5. #define VERBOSE(stream) \
  6. if(cmd_verbose && !cmd_quiet) \
  7.  { std::wcout << #stream << std::endl; }


 
Exemple d'utilisation :

Code :
  1. VERBOSE( L"Mode verbeux activé - Résumé des paramètres retenus :" );


 
Je sais, c'est pas très commun de concaténer des stream via des macro, si vous voyez une autre manière de faire. Ou si vous savez comment faire accepter les ## à gcc

Reply

Marsh Posté le 05-12-2008 à 15:38:58   

Reply

Marsh Posté le 05-12-2008 à 17:08:17    

utilise BOOST_PP_CAT et BOOST_PP_STRINGIZE qui doivent gérer ca proprement

Reply

Marsh Posté le 16-12-2008 à 10:50:32    

J'ai toujours pas trouvé, les macro boost on l'air d'etre autant bloqué que mes propres macro.
 
ce qui est étrange, c'est que les macro en ## marchent tres bien sous Visual. Alors que sous gcc, j'ai des messages d'erreur (en francais helas) :
 
erreur: le collage de « << » et de « L"No attribute for tag ATTRIBUTE_MD5" » ne donne pas d'alignement lexical de pré-traitement valide


Message édité par NounouRs le 16-12-2008 à 10:51:02
Reply

Marsh Posté le 16-12-2008 à 10:52:55    

Ouais mais L"Mode verbeux activé - Résumé des paramètres retenus :" c'ets deja une string :E

 

Essaye :

 
Code :
  1. #define CRASH(stream) { std::wcerr << L#stream << std::endl; }
  2. #define WARNING(stream) \
  3. if(!cmd_quiet) \
  4. { std::wcout << L#stream << std::endl; }
  5. #define VERBOSE(stream) \
  6. if(cmd_verbose && !cmd_quiet) \
  7. { std::wcout << L#stream << std::endl; }
 

et VERBOSE("tototototo" )

 

EDIT :

 

les chaines avec un L devant c'est pas spécifique visual aussi ??

Message cité 1 fois
Message édité par Joel F le 16-12-2008 à 10:53:25
Reply

Marsh Posté le 16-12-2008 à 14:18:52    

encadre surtout tes macros proprement.
 
#define WARN(msg) do { \
  if (...) { ... } \
while (0)
 
 
comme ça t'es blindé et tu peux faire des WARN("pouet" ); sans warning de ton compilateur.

Reply

Marsh Posté le 16-12-2008 à 17:32:17    

Joel F a écrit :

Ouais mais L"Mode verbeux activé - Résumé des paramètres retenus :" c'ets deja une string :E
 
Essaye :
 

Code :
  1. #define CRASH(stream) { std::wcerr << L#stream << std::endl; }
  2. #define WARNING(stream) \
  3. if(!cmd_quiet) \
  4. { std::wcout << L#stream << std::endl; }
  5. #define VERBOSE(stream) \
  6. if(cmd_verbose && !cmd_quiet) \
  7. { std::wcout << L#stream << std::endl; }


 
et VERBOSE("tototototo" )
 
EDIT :
 
les chaines avec un L devant c'est pas spécifique visual aussi ??


 
 
Je comprend bien que ca peut aider, je vais chercher à faire disparaitre ces L    mais hormis dans ces macro, gcc accepte parfaitement (sous linux)
 
si je n'avais qu'une stream à passer, tout irait bien, je ferais meme plutot une fonction globale ou un helper, mais non... ce que je cherchais à faire (et qui marche bien sous Visual) c'est de construire des chaine comme ca :
VERBOSE( L"Chemin de destination : " << arg_1_dest );
la macro la transforme en  
std::wcout << L"Chemin de destination : " << arg_1_dest << std::endl;
 
 
Je sens que je vais devoir passer par des variables intermédiaires... je vois pas encore la solution
 

Reply

Marsh Posté le 22-12-2008 à 12:21:16    

OK, j'ai trouvé, RESOLU !!!!
 
Sous Visual c'est la premiere partie, sous GCC, c'est la deuxieme (notes bien le ...)
 

Code :
  1. #ifdef _MSC_VER
  2. #define VERBOSE(stream) \
  3. if(cmd_verbose && !cmd_quiet) \
  4. { std::wcout << ##stream << std::endl; }
  5. #else
  6. #define VERBOSE(stream...) \
  7. if(cmd_verbose && !cmd_quiet) \
  8. { std::wcout << stream << std::endl; }
  9. #endif


 
C'est quoi la meilleure méthode pour distinguer les environnements de compilation ?  Là j'ai pris la premiere variable qui me tombait sous la main...


Message édité par NounouRs le 22-12-2008 à 12:22:15
Reply

Marsh Posté le 22-12-2008 à 15:03:44    

Reply

Marsh Posté le 22-12-2008 à 15:18:51    

Sinon tu fais un simple VERBOSE(...) std::wcout << __VA_ARGS__ << std::endl
 
ça devrait passer pour peu que ton compilateur C++ supporte des trucs C99

Reply

Sujets relatifs:

Leave a Replay

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