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 :

Identifieur unique avec macro mais sans __COUNTER__


Sujet :

C

  1. #1
    Membre habitué Avatar de Gui13
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Points : 133
    Points
    133
    Par défaut Identifieur unique avec macro mais sans __COUNTER__
    Salut,

    J'ai besoin de générer des identifiants uniques dans un header C, un truc dans le genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        #define BASE_ID 1000
        #define my_unique_ID        (BASE_ID + 1)
        #define my_other_unique_ID  (BASE_ID + 2)
        #define my_third_unique_ID  (BASE_ID + 3)
        [..]
    Avec 1, 2 et 3 générés automatiquement à la compilation.

    J'ai vu qu'on pouvait utiliser la variable __COUNTER__, mais j'utilise une version de GCC assez vieille qui ne supporte pas cette variable, et je ne peux pas mettre à jour mon GCC.

    Vous connaissez une solution?

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Peut-être peux-tu essayer un truc basé sur __LINE__ à la place?

    Ou bien, si le code s'y prête, utiliser une Enum au lieu d'un ensemble de defines (bien que je reconnaisse que ça n'est pas toujours possible et/ou approprié).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre habitué Avatar de Gui13
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Points : 133
    Points
    133
    Par défaut
    Effectivement, la solution à base d'ENUM est séduisante.

    Il faut que je réfléchisse à cette solution, car dans la réalité on a plusieurs "pools" d'ID possibles (exemples: un groupe d'ID pourra être entre 2000 et 2999, tandis que le suivant pourra être entre 3000 et 4000, etc..).

    On a déjà des scripts qui nous permettent d'identifier si des ID sont dupliqués; mais comment pourrait-t-on être sûr qu'un enum ne contient pas de valeurs hors de sa plage autorisée?

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Typiquement, on termine l'enum par une valeur qu'on considère comme son maximum, et on teste.
    Exemple:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    enum Toto
    {
    	TOTO_A = 1000,
    	TOTO_B,
    	TOTO_C,
    	...
    	TOTO_MAX
    };
    
    C_ASSERT(TOTO_MAX <= 1999);
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre habitué Avatar de Gui13
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Points : 133
    Points
    133
    Par défaut
    Hello,

    Effectivement, c'est une très bonne chose.
    Je n'ai pas accès à C_ASSERT, mais il existe une implémentation proche et qui fonctionne dans mon cas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #define PASTE2(x, y) x##y
    #define PASTE(x, y) PASTE2(x, y)
    #define CASSERT(predicate) typedef char PASTE(constraint_violated_on_line_,__LINE__)[2*((predicate)!=0)-1];
     
    // utilisé ainsi donne "fichier.h:35: size of array `constraint_violated_on_line_35 is negative
    CASSERT(1 == 2)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/11/2010, 08h03
  2. Tentative avec HttpWebRequest, mais sans succès.
    Par zooffy dans le forum ASP.NET
    Réponses: 13
    Dernier message: 28/07/2010, 15h46
  3. Réponses: 4
    Dernier message: 11/05/2009, 15h59
  4. Requete avec count mais sans grouper.
    Par fabrice91 dans le forum Requêtes
    Réponses: 19
    Dernier message: 29/04/2009, 16h25

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