IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

cout, string et TCHAR


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut cout, string et TCHAR
    TCHAR est un #define sur char ou wchar_t.
    Existe-t-il les mêmes #define pour cout et wcout, string et wstring, ostringstream et wostringstream, etc ?
    Merci.

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    En fait, string,istringstream, ostringstream wstring, wistringstream et wostringstrieam ne sont que des typedef de classes template, les uns spécialisant celles-ci avec des char, les autres les spécialisant avec des wchar.

    cin et cout sont, quant à elles, des instances globales de variables, dont le type est, de manière générale, dérivée des même flux que les *stringstream.

    Ce ne sont normalement pas de define, mais bel et bien des typedef
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Tu peux les définir toi même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #ifdef _UNICODE
    typedef std::wstring tstring;
    ...
    #else
    typedef std::string tstring;
    ...
    #endif
    ou une autre façon de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typedef std::basic_string<TCHAR> tstring;
    ...

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    koala01, merci mais je crois que tu n'as pas compris ma question.

    Sylvain, merci. J'aime bien l'autre façon de faire

    Donc rien n'est prévu en C++ pour compiler un projet entièrement en unicode ou en ascii. Ce n'est prévu que lorsqu'on fait du C avec l'api Windows et/ou la crt lib (avec les _tcscpy, _tcscmp, etc).

    Voilà à quoi j'en suis réduit, c'est pas trop élégant je trouve
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    #include <iostream>
    #include <iomanip>
    #include "tchar.h"
    #include <string>
     
    #ifndef _tstring
    # ifdef _UNICODE
    #  define _tstring wstring
    #else
    #  define _tstring string
    # endif
    #endif
     
    #ifndef _tcout
    # ifdef _UNICODE
    #  define _tcout wcout
    #else
    #  define _tcout cout
    # endif
    #endif
     
    ...
    int cppmain(int argc, _TCHAR* argv[])
    {
    	std::_tstring helloworld(_T("Hello world!");;
     
    	std::_tcout << _T("Message: ") << helloworld.c_str() << std::endl;
     
    #ifdef _DEBUG
    	std::_tcout << _T("DEBUG: press any key to finish") << std::endl;
    	_getch();
    #endif
    	return 0;
    }
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    #ifdef _DEBUG
    	OutputDebugString(argv[0]);
    	OutputDebugString(_T(" debug: main begins\n"));
    	_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); // | _CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_CHECK_CRT_DF 
    	//_CrtSetBreakAlloc(-1);//sets _crtBreakAlloc
    	//_crtBreakAlloc=-1;// <- set _crtBreakAlloc using the debugger without recompiling
    #endif
    	int exitCode;
    	__try
    	{
    		exitCode=cppmain(argc,argv);
    	}
    	__except(EXCEPTION_EXECUTE_HANDLER)
    	{
    		std::_tcout << std::endl << "Critical ERROR!!! structured exception handling" << std::endl << std::endl;
    		exitCode=EXIT_FAILURE;
    	}
    #ifdef _DEBUG
    	OutputDebugString(argv[0]);
    	OutputDebugString(_T(" debug: main ends\n"));
    #endif
    	return exitCode;
    }

  5. #5
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par camboui
    Ce n'est prévu que lorsqu'on fait du C avec l'api Windows et/ou la crt lib (avec les _tcscpy, _tcscmp, etc).
    C'est un peu vrai. Pour être plus exact, les TCHAR et fonctions associées font partie de la CRT et de l'API Windows qui peuvent toutes être utilisées aussi bien en C qu'en C++. Mais ont est bien d'accord que tout ça se sont des extensions Microsoft hein, éventuellement disponibles dans d'autres implémentations (pratiquement dans toutes les implémentations Windows).

    Citation Envoyé par camboui
    Voilà à quoi j'en suis réduit, c'est pas trop élégant je trouve
    En effet j'aurais préféré #define _tcout std::[w]cout par exemple, comme ça _tcout ne ferait pas partie de std.

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par camboui Voir le message
    Donc rien n'est prévu en C++ pour compiler un projet entièrement en unicode ou en ascii. Ce n'est prévu que lorsqu'on fait du C avec l'api Windows et/ou la crt lib (avec les _tcscpy, _tcscmp, etc).
    Sauf que je ne crois pas aux TCHAR et autre... Pourquoi je n'y crois pas ? simplement parce que pour un vrai projet, on va se retrouver à devoir gérer dans un seul programme différents types de chars, pour prendre en compte différents types de fichier. Donc pas de TCHAR partout...

    Et dans l'autre sens, quel intérêt sur du nouveau code de devoir gérer deux versions des exécutables, des DLL... non compatibles entre elles ?

    Sans compter que toutes ses macros, ça fini par causer des soucis (et si j'ai une variable qui porte le même nom qu'une des nombreuses macros définies pas VC++ pour gérer ça ?).

    Mon conseil est donc d'oublier ces histoires qui n'ont peut-être de l'intérêt que pour préparer un portage d'une vieille appli de char vers wchar_t sans tout casser lors de la phase de portage, et d'écrire directement le code en utilisant wchar_t en interne et en gérant les différents types d'encodage pour les fichiers externes.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Tu ne fais plus que des applis en wchar_t ?

    J'aurais peut-être dû y passer plus tôt puisque j'utilise souvent des objets COM qui m'impose cette m.rd. de BSTR (ADO, msxml, etc). D'un autre coté, on ne travaille qu'en ISO8859-1 (voir UTF8) avec des données sur fichiers qui font quelques gigas. Il est bon d'éviter de trimballer le double de volume qui ne contiendrait que des zéros en plus sans compter que de nombreux (vieux) outils ne connaissent que les char (en particulier ceux qui manipulent les fichiers texte, justement).

    D'un autre coté il y a un choix politique à faire. Pas simple tout ça...

Discussions similaires

  1. Conversion variable string en TCHAR dans dll
    Par Pierre95 dans le forum Débuter
    Réponses: 6
    Dernier message: 10/07/2013, 12h36
  2. Conversions : String->int et int->TCHAR
    Par CyberSlan dans le forum C++
    Réponses: 10
    Dernier message: 13/06/2008, 15h12
  3. Réponses: 2
    Dernier message: 25/04/2008, 06h37
  4. de Tchar[2048] à String
    Par PP(Team) dans le forum C++Builder
    Réponses: 10
    Dernier message: 23/04/2007, 14h45
  5. [C++> C#]Comment régler problème de type TCHAR*/string ?
    Par fkerbourch dans le forum C++/CLI
    Réponses: 6
    Dernier message: 10/03/2006, 09h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo