Définir des variables constantes dans l'en-tête C++
Un programme sur lequel je travaille beaucoup constantes qui s'appliquent à l'ensemble de toutes les classes. Je veux faire un fichier d'en-tête des "Constantes.h", et être en mesure de déclarer que toutes les constantes. Alors dans mes autres classes, je peux juste inclure #include "Constants.h
.
Je l'ai eu à travailler très bien avec #ifndef
... #define ...
de la syntaxe. Cependant, je préfère utiliser le const int...
forme de constantes. Je ne suis pas tout à fait sûr de savoir comment bien.
- Pouvez-vous expliquer ce que vous ne comprenez pas concernant
const int
? Post un exemple de code qui n'ont pas pu compiler si c'est votre question?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez simplement définir une série de
const ints
dans un fichier d'en-tête:Cela fonctionne car en C++ un nom d'espace de noms de champ d'application (y compris l'espace de noms global) qui est explicitement déclarée const et non explicitement déclaré extern a une liaison interne, de sorte que ces variables ne serait pas causer des doubles symboles lorsque vous liez ensemble d'unités de traduction. Vous pouvez également déclarer explicitement les constantes static.
C'est plus compatible avec le C et plus lisible pour les personnes qui peuvent ne pas être familiers avec le C++ règles d'assemblage.
Si toutes les constantes sont des entiers alors une autre méthode que vous pouvez utiliser est de déclarer les identificateurs les énumérations.
Toutes ces méthodes utilisent seulement un en-tête et de permettre à l'déclaré noms utilisés compiler des constantes de temps. À l'aide de
extern const int
et la mise en œuvre de fichier empêche les noms d'être utilisé comme compiler les constantes de temps.Note que la règle qui fait que certaines constantes implicitement une liaison interne ne s'appliquent à des pointeurs, exactement comme des constantes d'autres types. La chose la plus délicate, c'est que le marquage d'un pointeur comme
const
nécessite une syntaxe un peu différente que la plupart des gens utilisent pour faire des variables d'autres types de const. Ce que vous devez faire:de faire un pointeur constant, de sorte que la règle va s'appliquer à elle.
Noter également que c'est une des raisons, je préfère privilégier
const
après le type:int const
au lieu deconst int
. J'ai aussi mis le*
en regard de la variable: c'est à direint *ptr;
au lieu deint* ptr;
.J'aime faire ces sortes de choses, parce qu'elles reflètent le cas général de la façon dont C++ fonctionne vraiment. Les solutions de rechange (
const int
,int* p
) sont juste spéciales tubé à faire quelques choses simples, plus lisibles. Le problème est que quand tu sors de ces cas simples, le tubé alternatives activement trompeuse.Ainsi, bien que les exemples précédents montrent l'usage commun de la
const
, en fait, je peux recommander les gens écrire comme ceci:et
const
dans le bon endroit. Faire un pointeurconst
nécessite de placer leconst
après la*
. E. g.int * const x
. Si vous venez d'utiliserconst int *x;
puis leconst
se réfère à ce que le pointeur pointe de et de pas le pointeur lui-même.J'aime la espace de noms mieux pour ce genre de but.
Option 1 :
Option 2 :
Et je n'aurais jamais utiliser une Classe pour organiser ce type d'codé en dur Const variables.
En général, vous ne devriez pas utiliser, par exemple,
const int
dans un fichier d'en-tête, si c'est inclus dans plusieurs fichiers source. C'est parce que les variables seront définis une fois par fichier source (unités de traduction techniquement parlant) car mondialeconst
les variables sont implicitement statique, en prenant plus de mémoire que nécessaire.Vous devriez plutôt avoir une source particulière de fichier,
Constants.cpp
qui définit en fait les variables, et alors les variables déclarées commeextern
dans le fichier d'en-tête.Quelque chose comme ce fichier d'en-tête:
Et ce dans un fichier source:
const int
dans un fichier d'en-tête, depuisconst
variables ont une liaison interne par défaut. Si vous voulez que, plutôt qu'un seul exemple, c'est une autre question; en général, il fait peu de différence, tant que la valeur est disponible dans l'en-tête.C++17
inline
variablesCe génial C++17 fonction de nous permettre de:
constexpr
: Comment déclarer constexpr extern?main.cpp
notmain.php
notmain.cpp
Compiler et exécuter:
GitHub en amont.
Voir aussi: Comment puis-inline variables de travail?
C++ standard inline sur les variables
La norme C++ garantit que les adresses seront les mêmes. C++17 N4659 projet de norme
10.1.6 "La ligne spécificateur":
cppreference https://en.cppreference.com/w/cpp/language/inline explique que si
static
n'est pas donné, alors il a une liaison externe.Variable Inline mise en œuvre
Nous pouvons observer comment il est mis en œuvre avec:
qui contient:
et
man nm
dit à propos deu
:nous voyons donc qu'il y a un ELFE de la prolongation pour cette.
C++17 projet de norme sur le "global"
const
impliquestatic
C'est la citation pour ce qui a été mentionné à: https://stackoverflow.com/a/12043198/895245
C++17 n4659 projet de norme 6.5 "Programme" et de liaison":
"espace de noms" portée est ce que nous familièrement souvent référence en tant que "global".
L'annexe C (informative) Compatibilité, C. 1.2
Article 6: "concepts de base" donne la raison pour laquelle cela a été modifié à partir de C:
Voir aussi: Pourquoi ne const implique une liaison interne en C++, quand il n'est pas dans C?
Testé dans GCC 7.4.0, Ubuntu 18.04.
Plutôt que de faire un tas de variables globales, vous pouvez envisager de créer une classe qui a un tas de public static constantes. C'est toujours globale, mais de cette façon, il est enveloppé dans une classe de sorte que vous savez où la constante est à venir et que c'est censé être une constante.
Constantes.h
Constants.cpp
Alors vous pouvez l'utiliser comme ceci:
Il semble que bames53 de réponse peut être prolongé à la définition entier et non entier les valeurs des constantes dans l'espace de noms et la classe déclarations même si 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éfini dans un seul fichier d'en-tête est inclus dans plusieurs fichiers source.
Dans foo.cc:
Dans les messages.hh:
Dans bar.cc:
Dans zoo.cc:
Dans la barre.hh:
Dans zoo.hh:
Cela donne le résultat suivant:
Le type de données
char const * const
désigne une constante pointeur vers un tableau de caractères constante. La premièreconst
est nécessaire parce que (en fonction de g++) "ISO C++ forbids la conversion d'une chaîne constante de 'char*'". La deuxièmeconst
est nécessaire pour éviter les erreurs de liaison due à de multiples définitions de l' (alors insuffisamment constante) constantes. Votre compilateur peut pas se plaindre si vous omettez l'une ou des deuxconst
s, mais le code source est moins portable.