Il semble que la réponse de bames53 puisse être étendue à la définition de valeurs constantes entières et non entières dans les espaces de noms et les classes. déclarations même s'ils sont inclus dans plusieurs fichiers sources. Il n'est pas nécessaire de mettre les déclarations dans un fichier d'en-tête mais les définitions dans un fichier source. L'exemple suivant fonctionne pour Microsoft Visual Studio 2015, pour z/OS V2.2 XL C/C++ sur OS/390, et pour g++ (GCC) 8.1.1 20180502 sur GNU/Linux 4.16.14 (Fedora 28). Notez que les constantes sont déclarées/définies dans un seul fichier d'en-tête qui est inclus dans plusieurs fichiers source.
Dans foo.cc :
#include <cstdio> // for puts
#include "messages.hh"
#include "bar.hh"
#include "zoo.hh"
int main(int argc, const char* argv[])
{
puts("Hello!");
bar();
zoo();
puts(Message::third);
return 0;
}
Dans les messages.hh :
#ifndef MESSAGES_HH
#define MESSAGES_HH
namespace Message {
char const * const first = "Yes, this is the first message!";
char const * const second = "This is the second message.";
char const * const third = "Message #3.";
};
#endif
Dans bar.cc :
#include "messages.hh"
#include <cstdio>
void bar(void)
{
puts("Wow!");
printf("bar: %s\n", Message::first);
}
Dans zoo.cc :
#include <cstdio>
#include "messages.hh"
void zoo(void)
{
printf("zoo: %s\n", Message::second);
}
Dans le bar.hh :
#ifndef BAR_HH
#define BAR_HH
#include "messages.hh"
void bar(void);
#endif
Dans zoo.hh :
#ifndef ZOO_HH
#define ZOO_HH
#include "messages.hh"
void zoo(void);
#endif
Cela donne le résultat suivant :
Hello!
Wow!
bar: Yes, this is the first message!
zoo: This is the second message.
Message #3.
Le type de données char const * const
signifie un pointeur constant vers un tableau de caractères constants. Le premier const
est nécessaire car (selon g++) "ISO C++ interdit de convertir une constante de chaîne en 'char*'". Le second const
est nécessaire pour éviter les erreurs de liaison dues aux définitions multiples des constantes (alors insuffisamment constantes). Votre compilateur ne se plaindra peut-être pas si vous omettez l'une ou les deux constantes const
mais le code source est alors moins portable.