105 votes

Définir les variables constantes dans l'en-tête C++

Un programme sur lequel je travaille comporte de nombreuses constantes qui s'appliquent à toutes les classes. Je veux créer un fichier d'en-tête "Constants.h", et être capable de déclarer toutes les constantes pertinentes. Ensuite, dans mes autres classes, je peux simplement inclure #include "Constants.h .

Je l'ai fait fonctionner correctement en utilisant #ifndef ... #define ... syntaxe. Toutefois, je préférerais utiliser la const int... sous forme de constantes. Mais je ne sais pas vraiment comment faire.

0voto

Louis Strous Points 31

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X