Flux rss
Rechercher : dans
Par :

[C++] prgo multilangues - variables externes

MassLaMenace, le mardi 25 avril 2006 à 19:42:43 
 Signaler ce message aux modérateurs

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 :

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

1

mamiemando, le mercredi 26 avril 2006 à 00:15:58

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 :

const char *get_valueNegativeMsg();
const char *get_valueTooSmallMsg();
const char *get_valueTooBigMsg();

et de les implémenter dans msg.cpp.

Bonne chance

Répondre à mamiemando

2

Char Snipeur, le mercredi 26 avril 2006 à 17:52:04

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 Salutation !
Char Snipeur

Répondre à Char Snipeur

3

 MassLaMenace, le mercredi 26 avril 2006 à 19:25:24

Les 2 solutions proposes fonctionnent bien. Je les ai testees.

Merci pour votre aide.

Répondre à MassLaMenace
Variables externes (c) bonjour, j'ai un problème avec mes variables externes, des float, petit exemple : dans un fichier 1: ... int i = "100"; float f = "1.56" ... dans un fichier 2: ... extern i,f; ... printf ("%d",i); // me renvoie 100 printf("%f",f); // me renvoie... www.commentcamarche.net/forum/affich-2544040-variables-externes-c
C++ error LNK2001: unresolved external symbol bonjour tout le monde ! mon programme VisualC++ compile tres bien, mais j'arrive pas à faire le BUILD de l'exe. il me donne : DLLExplicit1.obj : error LNK2001: unresolved external symbol _mlfMira Debug/DLLExplicit1.exe : fatal error LNK1120: 1... www.commentcamarche.net/forum/affich-848878-c-error-lnk2001-unresolved-external-symbol
Langage C - Les variables Le concept de variable Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Les variables en langage C sont typées, c'est-à-dire que les données contenues dans... www.commentcamarche.net/contents/c/cvar.php3
PHP 5 - Utiliser une url externe avec la fonction includeL'option qui permet d'inclure un url externe (c'est à dire absolue, de la forme http://site.tld/url) via la fonction include est désactivée par défaut dans les versions 5 et ultérieures de PHP, pour l'activer sur votre serveur mettez ces deux lignes... www.commentcamarche.net/faq/sujet-15460-php-5-utiliser-une-url-externe-avec-la-fonction-include
[Bash] La variable d'environnement PATHLa variable d'environnement PATH I. Préambule II. C'est quoi le shell ? III. Définition IV. Séance de dissection V. Ajouter un répertoire à la variable PATH VI. Et puis... I. Préambule Sous les systèmes GNU/Linux qu'on le veuille ou... www.commentcamarche.net/faq/sujet-3585-bash-la-variable-d-environnement-path
[Langage C] C/C++ Erreur de segmentationQu'est ce qu'une erreur de segmentation Vous êtes en train de développer une application sous Linux en C/C++. Tout va bien, ça compile, les oiseaux chantent. Donc vous lancez votre application pour la tester. Et vous obtenez l'un de ces deux... www.commentcamarche.net/faq/sujet-4791-langage-c-c-c-erreur-de-segmentation
Verifier contenu variable C# (Résolu)Bonjour, Je voudrais savoir comment il faut faire pour controller le contenue d'une variable en C# (savoir si il s'agit de chiffre, de lettre, ...). qqn peut-il m'aider ? molasson www.commentcamarche.net/forum/affich-5816212-verifier-contenu-variable-c
[C] déclarer une variable hexadecimalBonjour, comment declarer en C un evariable hexadécimale int x = 0x10; quoi mettre à la place de int? byte? est-ce que x vaut 10 ou 16 dans ce cas? merci de l'aide www.commentcamarche.net/forum/affich-12139641-c-declarer-une-variable-hexadecimal
Cast en CBonsoir amis du soir ^^ Voilà je suis toujours à mes débuts en C, moi qui trouvait ce langage fort rustique je commence à bien l'aimé, surtout ses pointeurs c'est vraiment génial :) Mais j'ai une petite question, est-ce qu'on peux caster une variable... www.commentcamarche.net/forum/affich-10139418-cast-en-c
Langage C - Les opérateursQu'est-ce qu'un opérateur ? Les opérateurs sont des symboles qui permettent de manipuler des variables, c'est-à-dire effectuer des opérations, les évaluer, etc. On distingue plusieurs types d'opérateurs : les opérateurs de calcul les opérateurs... www.commentcamarche.net/contents/c/cop.php3
Langage C++ - Les variablesLe concept de variable Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Les variables en langage C++ sont typées, c'est-à-dire que les données contenues dans... www.commentcamarche.net/contents/cpp/cppvar.php3
Langage C++ - Les types de donnéesLes types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître... www.commentcamarche.net/contents/cpp/cpptype.php3