Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1412 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1822510
NounouRs
Non parce que c pas mon pied !
Posté le 05-12-2008 à 15:38:58  profilanswer
 

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

mood
Publicité
Posté le 05-12-2008 à 15:38:58  profilanswer
 

n°1822584
Joel F
Real men use unique_ptr
Posté le 05-12-2008 à 17:08:17  profilanswer
 

utilise BOOST_PP_CAT et BOOST_PP_STRINGIZE qui doivent gérer ca proprement

n°1827835
NounouRs
Non parce que c pas mon pied !
Posté le 16-12-2008 à 10:50:32  profilanswer
 

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
n°1827838
Joel F
Real men use unique_ptr
Posté le 16-12-2008 à 10:52:55  profilanswer
 

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
n°1827953
Taz
bisounours-codeur
Posté le 16-12-2008 à 14:18:52  profilanswer
 

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.

n°1828100
NounouRs
Non parce que c pas mon pied !
Posté le 16-12-2008 à 17:32:17  profilanswer
 

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
 

n°1830361
NounouRs
Non parce que c pas mon pied !
Posté le 22-12-2008 à 12:21:16  profilanswer
 

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
n°1830430
Taz
bisounours-codeur
Posté le 22-12-2008 à 15:03:44  profilanswer
 
n°1830441
Taz
bisounours-codeur
Posté le 22-12-2008 à 15:18:51  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
Installer le jdk et tout le reste sous windows xp[Bash Linux] compter dans un fichier
[Bash Linux] nombre d'un caractère choisiInstaller Pylint Windows
activation de macros dans excel 2007[Résolu] link avec lib openssl sous linux
xampp windows 2000 serveur mysql php5créer un lien vers l'explorer windows dans une page web...
problrmr de classepath avec java sous linuxEmacs sous Windows
Plus de sujets relatifs à : faire des macros avec l'operateur << windows et linux


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR