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

Langage C++ Discussion :

Comment compiler du code contenant des wchar_t sans utiliser ce type ?


Sujet :

Langage C++

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 12
    Points : 11
    Points
    11
    Par défaut Comment compiler du code contenant des wchar_t sans utiliser ce type ?
    Bonjour,
    J'ai un code assez important (plus de 1000 fichiers) qui compile déjà sous linux et windows.
    Je dois faire le portage de ce code sur un ARM946 dont la toolchain m'a été fourni par le fabricant. Cette toolchain (qui comprend GCC 4.0.1) supporte très mal les wchar_t. Je dois modifier au minimum le code existant.

    Je vais donc essayer plusieurs solutions (changer de toolchain, utiliser STLPorts, ...)

    Pour le moment je cherche à déclarer des macros pour que le code utilise des char à la place des wchar_t, quelque chose qui ressemblerai à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // Macros pour ne pas utiliser les whcar_t, à mettre dans un fichier à part
    #define wchar_t char
    #define L
     
    // Code
    void task_00 ()
    {
       wchar_t ChaineAvecAccent[] = L"Dépôt";
    }
    Problème : la redéfinition de L"" ne fonctionne pas.
    Est-ce qu'il est possible de redéfinir L"" ?

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 186
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 186
    Points : 17 126
    Points
    17 126
    Par défaut
    non
    et c'est une très mauvaise idée.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Ok merci, je vais trouver une autre solution alors.

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 611
    Points
    30 611
    Par défaut
    Citation Envoyé par pico12 Voir le message
    Ok merci, je vais trouver une autre solution alors.
    Salut,

    Heu... une question idiote, mais ca prend deux heures de compiler gcc sous linux...

    Ce ne serait pas deux heures bien utilisées?
    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

  5. #5
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Certains compilateurs n'ayant pas de wchar_t au début utilisaient des unsigned long pour les simuler (par un typedef). Ça me semble probablement plus propre qu'une macro, et certainement plus propre que de les rendre équivalents aux chars, si tu veux gérer correctement l’internationalisation (même si dans l'absolu, je déteste ce hack).

    Sinon, quand tu dis "supporte très mal", ça ne veut pas dire "ne supporte pas". Quels sont les problèmes avec les wchar_t existants ?
    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.

  6. #6
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    En fait il ne suffit pas de recompiler GCC, c'est toute la toolchain qu'il faut refaire, car la cible est en réalité un modem avec son propre OS (OpenAT).
    Il faut considérer ma cible plus comme quelque chose qui ressemble à un microcontrôleur.
    J'au contacté l'équipe de développement de cet OS qui m'a dit qu'ils n'avaient pas encore réussi à refaire une toolchain avec un GCC plus récent, mais qu'ils y travaillaient.

    Le problème est que la toolchain actuelle n'a pas été compilée pour prendre en compte les wchar_t. En modifiant directement les .h inclus pas le compilateur, j'ai réussi à faire que ça compile et que ça fonctionne presque.
    Mais il me manque plusieurs fonctions de manipulation des wstring (swscanf par exemple).
    Et j'ai des plantages à l'utilisation des flux (sur un mFluxUtf16 << setfill(L'0') par exemple). (Je crois que c'est parce que les flux contiennent une partie de code qui doit être compilé, pas seulement des .h).

    En attendant qu'OpenAT livre une toolchain avec un GCC à jour, j'ai donc opté pour l'horrible solution suivante :

    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
    #define wchar_t      char
    #define wstring      string
    #define wios         ios
    #define wstreambuf   streambuf
    #define wistream     istream
    #define wostream     ostream
    #define wiostream    wiostream
    #define wstringbuf   stringbuf
    #define wistringstream istringstream
    #define wostringstream ostringstream
    #define wstringstream stringstream
    #define wfilebuf     filebuf
    #define wifstream    ifstream
    #define wofstream    ofstream
    #define wfstream     fstream
     
    #define fgetwc       fgetc
    #define fputwc       fputc
    #define fputwchar    fputchar
    #define getwc        getc
    #define getwchar     getchar
    #define putwc        putc
    #define putwchar     putchar
    #define ungetwc      ungetc
    #define fgetws       fgets
    #define fputws       fputs
    #define fwprintf     fprintf
    #define wprintf      printf
    #define swprintf     sprintf
    #define vfwprintf    vfprintf
    #define vwprintf     vprintf
    #define vswprintf    vsprintf
    #define fwscanf      fscanf
    #define swscanf      sscanf
    #define wscanf       scanf
    #define wcslen       strlen
    #define wcstombs     strncpy
    #define wcscmp       strcmp
    #define wcsncmp      strncmp
     
    #define TEXT(quote) quote
    J'ai aussi fait un petit soft pour remplacer les L"abc" par des TEXT("abc").

    Aussi horrible soit-elle, cette modification fonctionne, et me permet de ne modifier le code qu'un minimum. Ca va me permettre d'avancer le temps qu'une nouvelle toolchain soit livrée.
    Voilà, à ne pas reproduire à la maison !

  7. #7
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Au passage, meme si tu ne dois pas toucher le code, faire un script qui remplace ces mots cles dans un clone du code ne serait pas plus safe? Ca fais le meme boulot mais tu peux voir le code en cas de probleme.

  8. #8
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 186
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 186
    Points : 17 126
    Points
    17 126
    Par défaut
    Chez moi, "ne pas toucher au code", c'est "ne pas changer ce qui est compilé", pas "ne pas modifier les fichiers"

    Tes defines sont non maitrisables, et potentiellement destructeurs.
    Comme tu n'ajoutes pas de controles, tu peuxvas tomber sur des erreurs de conversions ou erreurs de segmentations.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

Discussions similaires

  1. Réponses: 6
    Dernier message: 25/10/2010, 10h19
  2. Comment compiler avec javac des jar sans utiliser -cp
    Par Battosaiii dans le forum Langage
    Réponses: 7
    Dernier message: 06/10/2006, 18h03
  3. Comment protéger un dossier contenant des images ?
    Par guy777 dans le forum Sécurité
    Réponses: 12
    Dernier message: 17/06/2006, 23h42
  4. Comment déployer une appli contenant des TClientDataSet ?
    Par jobigoud dans le forum C++Builder
    Réponses: 6
    Dernier message: 26/10/2005, 20h18

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