De mixage externe et const
Puis-je mélanger extern et const, comme extern const? Si oui, le const qualificatif imposer son règne que dans la portée, il est déclaré dans la ou doit-il correspondre exactement à la déclaration de l'unité de translation, il est déclaré dans? I. e. puis-je déclarer les dire extern const int i;
, même si les je n'est pas un const, et vice-versa?
- Cette question n'est pas directement parler de toi, mais a toutes les informations requises: stackoverflow.com/questions/2151831/non-integral-constants/...
- Permettez-moi de mentionner à propos de la différence dans l'enchaînement ici: à l'Aide de
extern
avecconst
va désactiver const-pliage et de forcer le compilateur à allouer de la mémoire pour la constante, qui woulnd a pas été le cas autrement, où il va faire la substitution en place (après pliage, si possible). [par conséquent, il n'est pas conseillé, et j'ai décidé de l'utiliser :)] - si c'est une constante, pourquoi compilateur désactiver constantes en cas de extern?
- Parce que lors de la déclaration de
extern const
vous ne donnez pas une valeur d'initialisation (voir la accepté de répondre) et le compilateur s'attend à l'éditeur de liens pour "combler les vides" et ainsi de forcer l'éditeur de liens pour allouer de l'espace pour la constante.
Vous devez vous connecter pour publier un commentaire.
Le schéma habituel est:
extern const int a_global_var;
#include "file.h"
const int a_global_var = /* some const expression */;
Edit: Incorporé legends2k commentaire. Merci.
int a_global_var = <some_value_here>;
?const
s sont implicitementstatic
, vous avez besoin d'unextern
même sur lea_global_var
définition (dans fichier.c). Sans cela, tout ce qui comprend fichier.h ne sera pas le lien car il est à la recherche d'unconst int a_global_var
avec une liaison externe.extern
pas être là, c'est correct. Si la constante est pré-déclarés comme externe, puis extern dans la définition est facultatif. Même en l'absence explicite extern il permettra de définir un tel const objet avec une liaison externe. - stackoverflow.com/a/2151876/183120extern
extern const int a_global_var = /* expression */;
C++17
inline
variablesSi vous pensez que vous voulez un
extern const
, alors il est plus probable que vous voulez vraiment utiliser C++17 inline variables.Ce 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.
Pré-C++ 17:
extern const
extern const
ne fonctionne pas comme dans l'exemple ci-dessous, mais les inconvénients en plus deinline
sont:constexpr
avec cette technique, seulementinline
permet: Comment déclarer constexpr extern?main.cpp
notmain.cpp
notmain.php
GitHub en amont.
Pré-C++17-tête uniquement alternatives
Elles ne sont pas aussi bon que le
extern
solution, mais ils travaillent et de prendre uniquement un seul emplacement de mémoire:Un
constexpr
fonction, parce queconstexpr
impliqueinline
etinline
permet (forces) de la définition de figurer sur chaque unité de traduction:et je parie que tout bon compilateur inline l'appel.
Vous pouvez également utiliser un
const
ouconstexpr
statique de la variable de type entier comme dans:mais vous ne pouvez pas faire des choses comme la prise de son adresse, ou autre chose, elle devient odr-utilisé, voir aussi: https://en.cppreference.com/w/cpp/language/static "Constante de membres statiques" et La définition de constexpr données membres statiques
Toute façon de l'inclure?
TODO: est-il possible de pleinement inline de la variable, sans utiliser toute la mémoire à tout?
Ressemble beaucoup à ce que le préprocesseur n'.
Cela nécessiterait en quelque sorte:
Connexes:
Testé sur Ubuntu, 18.10, GCC 8.2.0.
constexpr
est implicitement une variable inline. ".inline
le problème est que, si une autre DLL est lié à l'encontre de votre fichier DLL déjà, et vous avez changé juste que la valeur que reconstruit votre fichier DLL, la vieille DLL serait de les garder sur l'utilisation de l'ancienne valeur.extern const
résout ce problème, mais il nécessite une réelle mémoire de recherche chaque fois qu'un de vos lien-les clients des requêtes de la valeur.Vous pouvez les utiliser ensemble. Mais vous devez être cohérent sur votre utilisation de const parce que quand C++ n'décoration de nom, const est inclus dans le type d'information qui est utilisé pour décorer les noms de symbole. donc
extern const int i
fera référence à une variable autre queextern int i
Sauf si vous utilisez extern "C" {}. C le nom de la décoration ne fait pas attention à const.
Vous pouvez les utiliser ensemble et vous pouvez faire toutes sortes de choses qui ignorent le mot-clé const, parce que c'est tout ce qu'il est; un mot-clé. Il indique au compilateur que vous ne serez pas en changeant une variable qui à son tour permet au compilateur de faire quelque chose d'utile optomisations et vous empêche de changer les choses que tu ne voulais pas.
Possibility.com a un article décent avec un peu plus de fond.
Oui, vous pouvez les utiliser ensemble.
Si vous déclarez "extern const int i", alors i est constante sur toute sa portée. Il est impossible de le redéfinir en tant que non-const. Bien sûr, vous pouvez contourner le const drapeau par un moulage à l'écart (à l'aide de const_cast).