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 :

Générer un nom de variable unique via une macro


Sujet :

C

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 168
    Points : 140
    Points
    140
    Par défaut Générer un nom de variable unique via une macro
    Bonjour,

    Je travaille sur un système de log dans un vieux projet dont code est très loin d'être un modèle de propreté (6000 lignes de codes avec un switch de 3000 lignes, des returns et des goto).

    Pour log, on utilise une maccro :
    DEBUG_LOG(...);

    Pour que les logs soient plus lisibles, on doit y ajouter un système de Tag qui affiche dans la console ou le fichier, un tag passé en paramètre et qui tabule les logs suivant jusqu'à ce que son scope soit terminé.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [Log]Debut de la fonction main
    [TAG]--------- Initialisation des variables -------
    [LOG]        Debut de la fonction d'initialisation
    ....

    L'idée est de créer une instance d'une classe C++ via une macro qui grâce à son constructeur augmente une variable statique m_uiNbTabulation de la classe "MyLog" (dont des fonctions sont appelées via DEBUG_LOG) et quand le scope est fini, le destructeur décrémente la variable m_uiNbTabulation de manière automatique.

    Du coup ma macro DEBUG_TAG a été définie à la base comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define DEBUG_TAG(fmt , ...)     ALog _var##__LINE__(fmt,__VAR_ARGS__);
    Seul problème, il peut y avoir plusieurs tag dans un même scope et je ne trouve pas de moyen de créer des variables avec un nom unique via le préprocesseur.

    Exemple :

    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
    DEBUG_TAG("Avant le switch");
    switch(value)
    {
        case 1 :
       {
          DEBUG_TAG("cas 1");
         ...
       }
       break ;
     
        case 2 :
        {
           DEBUG_TAG("cas 2");
         ... 
         }
        break;
     
        ...
    }

    Est-ce que quelqu'un a une idée pour générer des noms de variables unique ?

    Merci d'avance

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par Drannor Voir le message
    Est-ce que quelqu'un a une idée pour générer des noms de variables aléatoirement ?
    Aléatoire, je ne sais pas, mais tu peux utiliser les définitions __FILE__ et __LINE__ pour générer des noms de variables uniques.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Tu peux être plus précis ? Je ne vois pas du tout où tu veux en venir. Une instance de classe C++ ou une variable locale en C a toujours la durée de vie du « scope » dans lequel elle est déclarée…

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 168
    Points : 140
    Points
    140
    Par défaut
    Effectivement, je ne voulais pas dire aléatoirement mais unique.
    Titre modifié.


    Obsidian

    J'ai reformulé mon premier post pour mieux exposé la situation et rendre les choses, je l'espère, plus claires.


    ram-0000

    Utiliser __LINE__ ne fonctionne pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define Log(Fmt,...)  ALog _var##__LINE__(Fmt,__VAR_ARGS_);
    est transformé en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALog _var__LINE__(Fmt,...);
    Du coup si je veux loguer deux fois dans un scope, il défini deux fois la même variable ce qui entraine un problème de compilation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error C2374: '_var___LINE__' : redefinition; multiple initialization

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Mars 2011
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    C'est un vieux thread, mais je réponds quand même car je suis tombé dessus via google en cherchant la même chose.

    C'est un problème classique. Il se résout en faisant un niveau supplémentaire de concaténation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define SUB_STR(s) #s
    #define STR(s) SUB_STR(s)
    et là, STR(__LINE__) fonctionne et retourne le nombre en tant que chaîne.

    cf. http://fr.wikiversity.org/wiki/Langa...3%A9rateurs_et

    Après, sur l'idée de départ de générer un nom de variable aléatoire, cela me semble très louche...

Discussions similaires

  1. évaluation du nom de la table via une sous requête
    Par _ceone dans le forum SQL Procédural
    Réponses: 0
    Dernier message: 22/10/2007, 15h47
  2. Perl : nom de variable dépendant d'une autre
    Par nicolaskarp dans le forum Langage
    Réponses: 9
    Dernier message: 06/08/2007, 03h05
  3. Générer un nom de variable
    Par Belouda dans le forum MATLAB
    Réponses: 8
    Dernier message: 05/06/2007, 16h14
  4. [Smarty] nom de variable composé d'une chaîne et d'une variable
    Par Philoulheinz dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 17/05/2007, 10h13
  5. [Système] Générer un nom d'image unique
    Par ToxiZz dans le forum Langage
    Réponses: 14
    Dernier message: 22/12/2006, 15h56

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