[C++] prgo multilangues - variables externes
Résolu
MassLaMenace
-
MassLaMenace -
MassLaMenace -
Bonjour a tous,
J'essaye de realiser un programme multilangue a la compilation. Pour ce faire je definis mes variables dans un fichiers que je choisi a la compilation en fonction d'une macro predifinie. Les messages multilangues sont uniquement des messages d'erreurs. Ils sont donc inclus dans un unique fichier, qui est lui inclut dans de nombreux autres.
Mon message d'erreur est le suivant :
Le contenu de mes fichiers sont :
msg.en.h
msg.fr.h
msg.h
exceptions.h
Et comme je vous l'ai de nombreux fichiers (ceux qui sont la source de mes messages d'erreur) incluent exceptions.h
Comment puis je regler ce probleme ? L'utilisation du mot clef 'extern' est elle justifiee ?
Que puis je faire pour obtenir un programme multilangues (a la compilation ou al'execution) avec une autre solution ?
Merci de votre attention,
Thomas
J'essaye de realiser un programme multilangue a la compilation. Pour ce faire je definis mes variables dans un fichiers que je choisi a la compilation en fonction d'une macro predifinie. Les messages multilangues sont uniquement des messages d'erreurs. Ils sont donc inclus dans un unique fichier, qui est lui inclut dans de nombreux autres.
Mon message d'erreur est le suivant :
obj/chainmail.o(.data+0x0):chainmail.cc: multiple definition of `valueNegativeMsg' obj/main.o(.data+0x0):main.cc: first defined here obj/chainmail.o(.data+0x4):chainmail.cc: multiple definition of `valueTooSmallMsg' obj/main.o(.data+0x4):main.cc: first defined here obj/chainmail.o(.data+0x8):chainmail.cc: multiple definition of `valueTooBigMsg' obj/main.o(.data+0x8):main.cc: first defined here obj/pr2d.o(.data+0x0):pr2d.cc: multiple definition of `valueNegativeMsg' obj/main.o(.data+0x0):main.cc: first defined here obj/pr2d.o(.data+0x4):pr2d.cc: multiple definition of `valueTooSmallMsg' obj/main.o(.data+0x4):main.cc: first defined here obj/pr2d.o(.data+0x8):pr2d.cc: multiple definition of `valueTooBigMsg' obj/main.o(.data+0x8):main.cc: first defined here obj/pr2d-neighborarea.o(.data+0x0):pr2d-neighborarea.cc: multiple definition of `valueNegativeMsg' obj/main.o(.data+0x0):main.cc: first defined here obj/pr2d-neighborarea.o(.data+0x4):pr2d-neighborarea.cc: multiple definition of `valueTooSmallMsg' obj/main.o(.data+0x4):main.cc: first defined here obj/pr2d-neighborarea.o(.data+0x8):pr2d-neighborarea.cc: multiple definition of `valueTooBigMsg' obj/main.o(.data+0x8):main.cc: first defined here obj/shape.o(.data+0x0):shape.cc: multiple definition of `valueNegativeMsg' obj/main.o(.data+0x0):main.cc: first defined here obj/shape.o(.data+0x4):shape.cc: multiple definition of `valueTooSmallMsg' obj/main.o(.data+0x4):main.cc: first defined here obj/shape.o(.data+0x8):shape.cc: multiple definition of `valueTooBigMsg' obj/main.o(.data+0x8):main.cc: first defined here
Le contenu de mes fichiers sont :
msg.en.h
const char *valueNegativeMsg = "value is negative, that why this exception has been throw."; const char *valueTooSmallMsg = "value is smaller than limit, therefore modification can not be apply."; const char *valueTooBigMsg = "value is bigger than limit, therefore modification can not be apply.";
msg.fr.h
const char *valueNegativeMsg = ("value est negatif, c'est pourquoi cette exception fut jetee."); const char *valueTooSmallMsg = ("value est plus petit que limit, donc la modification ne peut pas etre appliquee."); const char *valueTooBigMsg = ("value est plus grande que limit, donc la modification ne peut pas etre appliquee.");
msg.h
#ifndef __MSG_H__ #define __MSG_H__ extern const char *valueNegativeMsg; extern const char *valueTooSmallMsg; extern const char *valueTooBigMsg; #if defined(__EN__) #include "en/msg.en.h" #elif defined(__FR__) #include "fr/msg.fr.h" #endif #endif // __MSG_H__
exceptions.h
#ifndef __EXPCEPTIONS_H__ #define __EXPCEPTIONS_H__ #define __FR__ #include <string> #include <stdexcept> #include "lang/msg.h" ...
Et comme je vous l'ai de nombreux fichiers (ceux qui sont la source de mes messages d'erreur) incluent exceptions.h
Comment puis je regler ce probleme ? L'utilisation du mot clef 'extern' est elle justifiee ?
Que puis je faire pour obtenir un programme multilangues (a la compilation ou al'execution) avec une autre solution ?
Merci de votre attention,
Thomas
A voir également:
- [C++] prgo multilangues - variables externes
- Nuage de points excel 4 variables - Forum Excel
- Bash addition 2 variables ✓ - Forum Shell
- Lecteurs de dvd externes pour ordinateurs portables - Forum PC portable
- Algorithme permutation 3 variables - Forum Programmation
- Plusieurs séries, nuage en points ✓ - Forum Bureautique
3 réponses
En fait lorsque tu compiles séparemment chaque fichier cpp utilisant msg.hpp, il intègre la définition de tes variables dans le .o
Au linkage, au moment de recoller les .o, il obtient donc une multidéfinition.
Je pense que le plus simple et le plus propre est de définir des fonctions :
et de les implémenter dans msg.cpp.
Bonne chance
Au linkage, au moment de recoller les .o, il obtient donc une multidéfinition.
Je pense que le plus simple et le plus propre est de définir des fonctions :
const char *get_valueNegativeMsg(); const char *get_valueTooSmallMsg(); const char *get_valueTooBigMsg();
et de les implémenter dans msg.cpp.
Bonne chance
Salut.
Bien vu mamiemando ! Je sais pas si j'aurai trouver.
Autre possibilité, utilisé les macro à fond : tu vire les extern et les variables.
#ifdef __FR__
#define valueNegativeMsg "value est negatif, c'est pourquoi cette exception fut jetee."
#endif
et ensuite, tu utilise "valueNegativeMsg" comme une variable.
Si tu voi le principe...
Moi, j'aurai plutot traduit throw par lancer. et tu aurai pu traduire "value"
et apply par "effectuer" (mais la je suis pas sur)
Bonne chance
Bien vu mamiemando ! Je sais pas si j'aurai trouver.
Autre possibilité, utilisé les macro à fond : tu vire les extern et les variables.
#ifdef __FR__
#define valueNegativeMsg "value est negatif, c'est pourquoi cette exception fut jetee."
#endif
et ensuite, tu utilise "valueNegativeMsg" comme une variable.
Si tu voi le principe...
Moi, j'aurai plutot traduit throw par lancer. et tu aurai pu traduire "value"
et apply par "effectuer" (mais la je suis pas sur)
Bonne chance