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 :

#ifdef dans une macro


Sujet :

C++

  1. #1
    cedrix57
    Invit�(e)
    Par d�faut #ifdef dans une macro
    Bonjour,

    Je cherche � faire une macro ou fonction inline de ce genre:


    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    inline CString readID(int id){
      CString strFilter;
      strFilter.LoadString(id);
      return strFilter;
    }
     
    #define transT2(str) \
    #ifdef str \
      readID(id) \
    #else \
      _T("str")
    L'id�e est que:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    #define CHAINE "toto"
    CString s1 = transT2(CHAINE); //renvoie "toto"
    CString s2 = transT2(CHAINE_NON_DEFINIE); //renvoie "CHAINE_NON_DEFINIE"
    Quelqu'un sait comment je pourrai faire ce genre de macro?
    Id�alement je voudrais faire �a:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    #define TOTO "toto_modifie1"
    #define TO_TO "toto_modifie2"
    CString s1 = transT2("toto"); //renvoie "toto_modifie1" car TOTO est définie
    CString s1 = transT2("to to"); //renvoie "toto_modifie2" car TO_TO est définie
    CString s1 = transT2("toyota"); //renvoie "toyota" car la macro TOYOTA n'est pas définie
    Je sait pas si c'est possible?

    Merci d'avance

  2. #2
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Bonjour,

    c'est impossible.
    Il te faut revoir ce qu'est r�ellement une macro, �a sert juste � effectuer un remplacement avant la compilation.
    La passe n'est r�alis�e qu'une seule fois.
    Le contenu des cha�nes de caract�res ne sera jamais modifi�.
    C'est sensible � la casse.

    Ton besoin est surement mal d�finie, les m�canismes que tu esp�res mettre en place ne sont pas clairs et bancals.

    Par exemple
    - pourquoi des define et non des enum ?
    - pourquoi une macro et non une fonction ?
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  3. #3
    Membre actif
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    D�cembre 2011
    Messages
    54
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 54
    Par d�faut
    Bonjour,

    Alors, plusieurs choses:
    - un ifdef dans une d�finition de macro n'est pas une syntaxe valide. Donc tu ne pourras pas utiliser �a
    - ceci mis � part, dans le code de ta macro, d'o� sort "id"? Et du coup, dans tes exemples, lorsque le symbole est d�fini, la macro devrait plut�t retourner une chaine contenant un entier
    - _T("str") fera que si le symbole n'est pas d�fini, tu auras toujours "str" dans ta chaine de caract�re au final. Pour transformer un symbole en chaine de caract�re, �a se fait en utilisant le caract�re # devant ton symbole. �a donnerait _T(#str). Mais le probl�me c'est que ta chaine de caract�re vaudra toujours "str" quand m�me, puisque c'est ce symbole qui sera transform�.

    Bref, il y a pas mal d'incompr�hension sur le langage et la syntaxe j'ai l'impression. Quelle est la finalit�? J'imagine que c'est pour g�rer la localisation d'une application?

  4. #4
    cedrix57
    Invit�(e)
    Par d�faut
    Bref, il y a pas mal d'incompr�hension sur le langage et la syntaxe j'ai l'impression.
    Oui je me doutais que cela n'�tait probablement pas possible...mais pour illustrer mon id�e j'ai pas trouv� mieux que de mettre du code faux.

    Quelle est la finalit�? J'imagine que c'est pour g�rer la localisation d'une application?
    En fait je d�veloppe avec Microsoft Visual C++ et les MFC. Dans mon programme j'ai plusieurs cha�ne de caract�re. Je vais devoir internationaliser mon programme dans plusieurs langue. Pour ceux qui connaissent la programmation C++ MFC, il existe un syst�me de ressource dans lesquelles on peut d�finir ce qu'on appelle un "table string". Dans ce type de ressource il est possible de d�finir plusieurs cha�ne de caract�re et d'associer � chacune un ID. Ensuite le chargement d'une cha�ne se fait de la mani�re suivante:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    CString strFilter;
    strFilter.LoadString(id);
    Mais j'aime pas trop ce syst�me car � chaque fois que je d�clare une cha�ne je dois aller dans l'�diteur de ressource (qui bien-s�r ne marche que si je charge deux fois un m�me projet et utilise la deuxi�me instance), et la d�finir ce qui est long � faire et me fait perdre mon fil.

    Tu coup j'aimerai bien avoir une fonction/macro o� n'importe qui fasse un truc du genre:
    Si l'ID est d�finie (�a veut dire que j'ai pris le temps d'aller �diter mon fichier ressource, ce que je peux �ventuellement automatiser avec un script python) j'aimerai bien le charger la cha�ne depuis le fichier ressource.
    Sinon je renvoie une cha�ne de caract�res.

    Pour le moment j'ai pens� � un seul truc:
    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
     
    inline CString readID(int id){
      CString strFilter;
      strFilter.LoadString(id);
      return strFilter;
    }
     
    CString strFilter = 
    #ifdef ID_STRING
    readID(ID_STRING);
    #else
    _T("ID_STRING");
     
    CString strFilter2 = 
    #ifdef ID_STRING2
    readID(ID_STRING2);
    #else
    _T("ID_STRING2");
    Pour chaque cha�ne je peux les charger de cette mani�re...mais mon objectif �tant de gagner du temps j'aimerai bien encapsuler �a quelque par mais j'ai pas encore trouver comment faire.

  5. #5
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Et � quel moment as-tu lu la doc de LoadString ?

    Qui indique clairement qu'elle renvoit un bool indiquant si oui ou non la cha�ne a �t� trouv�e et charg�e ?

    L'id�e de defines pour les id est mauvaise amha, tu veux un id, tu fous un id, et tu cherches pas s'il existe ou non, ce doit �tre un id.
    Que la cha�ne correspondante existe ou non ne change pas �a.

    Apr�s �ventuellement tu traficoteras quelque chose autour.
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  6. #6
    Membre actif
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    D�cembre 2011
    Messages
    54
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 54
    Par d�faut
    Personnellement, j'�viterai de coller �a directement dans le code. Je passerai plut�t par une ressource externe, comme par exemple un fichier pour chaque langue.
    Il y a certainement des libs qui g�rent la localisation, mais si je devais en �crire une, je ferais simple, avec une classe CLocalisation par exemple, qui lirait ces diff�rents fichiers de ressource dans lequel une chaine de caract�re serait associ� � un ID (sous forme d'entier ou de chaine de caract�re), chargeant tout �a dans une map. Ensuite, tu l'interroges comme ceci:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    CLocalisation localisation();
    localisation.SetLocal("FR");
    CString strFileNotFound = localisation.GetString("FILE_NOT_FOUND");
    et l'objet s'occupe de te retourner la vrai chaine de caract�re si elle est pr�sente dans la map, sinon il te retourne l'ID que tu lui as pass� en param.

    Faire tout �a avec une macro implique plus ou moins une partie de code en dur, c'est toujours assez genant. Surtout si tes chaines de caract�res sont d�clar�es avec des define, �a va dire que la moindre modif de texte n�cessite une compilation. Au moins, avec un fichier de ressource externe, tu peux m�me donner un fichier � traduire � quelqu'un, sans rien toucher aux sources.


    My 2 cents.

  7. #7
    Expert �minent

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    Par d�faut
    Tu as regard� du cot� de gettext?

Discussions similaires

  1. newline dans une macro proc�dure
    Par Puyi dans le forum C
    R�ponses: 9
    Dernier message: 19/04/2006, 16h01
  2. Ex�cuter une sub d'un module dans une macro
    Par pnoel-bi dans le forum Access
    R�ponses: 3
    Dernier message: 03/03/2006, 10h39
  3. Code asm dans une macro C
    Par progfou dans le forum C
    R�ponses: 11
    Dernier message: 01/03/2006, 18h50
  4. Comment ins�rer une macro excel dans une macro word?
    Par max2245 dans le forum VBA Word
    R�ponses: 15
    Dernier message: 07/01/2006, 17h44
  5. pb dans une macro excel VB
    Par syl221 dans le forum Macros et VBA Excel
    R�ponses: 6
    Dernier message: 20/10/2005, 17h29

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