[Solved] Namespace dynamiques

Namespace dynamiques [Solved] - C++ - Programmation

Marsh Posté le 16-01-2006 à 11:07:00    

Hello,
 
   J'aurais besoin definir un nom de namespace qui depend de la valeur d'une certaine variable definie dans mon makefile et d'un variable predefinie qui ne change jamais (dans une macro par exemple).
 
Par exemple, si dans mon makefile j'ai:
VERSION=1-0
Je voudrais que mon namespace se nomme "Package1-0".
 
Je ne sais pas trop comment m'y prendre. J'ai essaye de definir une macro qui definit le nom de mon namespace:
#define NOM "Package"VERSION
 
Evidemment ca ne marche pas quand je fais ca:
 

Code :
  1. namespace NOM
  2. {
  3. ...
  4. }


 
Meme si je definit VERSION egalement comme une macro:
#define VERSION "1-0"
 
Quelqu'un a-t-il une idee?
 
Merci beaucoup


Message édité par agyspace le 27-01-2006 à 14:09:16
Reply

Marsh Posté le 16-01-2006 à 11:07:00   

Reply

Marsh Posté le 16-01-2006 à 13:37:37    

Code :
  1. #define BEGIN_NAMESPACE(NOM) namespace Package ## VERSION {
  2. #define END_NAMESPACE(_) }
  3. // Exemple :
  4. BEGIN_NAMESPACE(1_0)
  5. // code
  6. END_NAMESPACE()


 
Non ?
 
evite les . , ou - dans les noms du namesapce aussi ;)

Reply

Marsh Posté le 16-01-2006 à 14:35:47    

En fait g trouve une moyen de configurer le nom d'un namespace:
 

Code :
  1. #define CCCAPI ccconcealment


 
mais je voudrais concatener a ce nom le contenu d'une variable definie dans mon makefile. Du genre:
 

Code :
  1. #define CCCAPI ccconcealment"$VARIABLE"


 
Sauf que ca ca ne marche pas...Comment utiliser des variables definies dans un Makefile? Est-ce possible?
Si oui comment?

Reply

Marsh Posté le 16-01-2006 à 15:32:05    

je viens de te montrer c'est ## :sarcastic:
 
#define CCCAPI ccconcealment ## VARIABLE


Message édité par Joel F le 16-01-2006 à 15:32:18
Reply

Marsh Posté le 16-01-2006 à 17:22:56    

Au temps pour moi j'avais mal lu ^^ :)

Reply

Marsh Posté le 16-01-2006 à 18:23:41    

Heu c'est la syntaxe exacte parce ke ca ne marche pas

Reply

Marsh Posté le 17-01-2006 à 17:09:29    

Joel F a écrit :

Code :
  1. #define BEGIN_NAMESPACE(NOM) namespace Package ## VERSION {
  2. #define END_NAMESPACE(_) }
  3. // Exemple :
  4. BEGIN_NAMESPACE(1_0)
  5. // code
  6. END_NAMESPACE()




Là j'ai appris quelque chose. Sinon pourquoi le paramètre NOM dans la macro BEGIN_NAMESPACE(NOM) alors qu'il n'est pas utilisé ?

Message cité 1 fois
Message édité par slash33 le 17-01-2006 à 17:11:30
Reply

Marsh Posté le 17-01-2006 à 18:41:57    

slash33 a écrit :

Là j'ai appris quelque chose. Sinon pourquoi le paramètre NOM dans la macro BEGIN_NAMESPACE(NOM) alors qu'il n'est pas utilisé ?


 
tu auras corrigé de toi même ...
 

Code :
  1. #define BEGIN_NAMESPACE() namespace Package ## VERSION {
  2. #define END_NAMESPACE(_) }
  3. // Exemple :
  4. BEGIN_NAMESPACE()
  5. // code
  6. END_NAMESPACE()


 
J'avais pas vu qu'il lisait la version depuis une macro ...

Reply

Marsh Posté le 19-01-2006 à 18:05:38    

Bon j'ai reussi a faire cette */@#$%* de concatenation  :D  
 
Pour reutiliser une variable definie dans un makefile dans son code. Par exemple:
TOTO=toto
On doit ajouter a sa ligne de compilation l'option -DNOM_DE_SON_CHOIX=$(TOTO)
Une fois dans le code, l'utilisation de la variable NOM_DE_SON_CHOIX telle quelle suffira a obtenir le contenu de TOTO.
 
Ensuite, si on veut concatener le contenu de toto a une autre "chaine", on definit une macro comme ceci:
 

Code :
  1. #define CONC(a,b)  a##b
  2. #define CONC2(a,b)  CONC(a,b)
  3. #define MY_NAMESPACE       CONC2(namebase,NOM_DE_SON_CHOIX)


 
En effet, il faut redefinir 2 fois la concatenation, car on veut expander une macro (c'est encore un peu obscure pour moi  :whistle: ). Si on ne definit qu'une fois la concatenation comme ceci:

Code :
  1. #define CONC(a,b)  a##b
  2. #define MY_NAMESPACE       CONC(namebase,NOM_DE_SON_CHOIX)


Et bien le resultat sera toujours namebaseNOM_DE_SON_CHOIX en "dur", ce n'est donc pas ce qu'on veut  :o  
 
Pour avoir un namespace qui est le resultat de la concatenation, il suffit alors de faire
 

Code :
  1. namespace MY_NAMESPACE
  2. {
  3. ...
  4. }


 
Voila, en esperant que ca ne servira pas qu'a moi, car c'est tres pratique les namespaces dynamiques dans certains cas :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed