Qu'est-ce que le lien externe et le lien interne?
je veux comprendre le lien externe et le lien interne et leur différence.
je veux aussi savoir le sens de
const
variables interne de lien par défaut, sauf mention contraire deextern
.
9 réponses
lorsque vous écrivez un fichier d'implémentation ( .cpp
, .cxx
, etc) votre compilateur génère une Unité de traduction . Il s'agit du fichier objet de votre fichier de mise en œuvre plus tous les en-têtes que vous #include
D dans lui.
internal linkage se réfère uniquement à tout dans le champ d'application d'une unité de traduction .
lien Externe se réfère à des choses qui existent au-delà d'une unité de traduction particulière. En d'autres termes, accessible par l'ensemble du programme , qui est la combinaison de toutes les unités de traduction (ou fichiers objet).
Comme dudewat dit externe lien signifie que le symbole (fonction ou une variable globale est accessible tout au long de votre programme et de interne lien signifie que c'est uniquement accessible dans une unités de traduction .
vous pouvez explicitement contrôler la liaison d'un symbole en utilisant les mots-clés extern
et static
. Si le lien n'est pas spécifié alors le la liaison par défaut est extern
pour les symboles autres que const
et static
(interne) pour les symboles const
.
// in namespace or global scope
int i; // extern by default
const int ci; // static by default
extern const int eci; // explicitly extern
static int si; // explicitly static
// the same goes for functions (but there are no const functions)
int foo(); // extern by default
static int bar(); // explicitly static
notez qu'au lieu d'utiliser static
pour la liaison interne, il est préférable d'utiliser namespaces anonymes dans lequel vous pouvez également mettre class
es. Le lien pour les namespaces anonymes a changé entre C++98 et C++11 mais l'essentiel est qu'ils sont inaccessibles à partir d'autres unités de traduction.
namespace {
int i; // external linkage but unreachable from other translation units.
class invisible_to_others { };
}
- une variable globale a lien externe par défaut. Son champ d'application peut être étendu aux fichiers autres que ceux qui le contiennent en donnant une déclaration externe correspondante dans l'autre fichier.
- la portée d'une variable globale peut être limitée au fichier contenant sa déclaration en préfixant la déclaration par le mot-clé statique . De telles variables sont dites avoir interne lien .
prenons l'exemple suivant:
1.cpp
void f(int i);
extern const int max = 10;
int n = 0;
int main()
{
int a;
//...
f(a);
//...
f(a);
//...
}
- la signature de la fonction f déclare f comme une fonction avec liaison externe (par défaut). Sa définition doit être fournie plus loin dans ce dossier ou dans une autre unité de traduction (donnée ci-dessous).
- max est défini comme une constante entière. La liaison par défaut pour les constantes est interne . Son lien est changé en externe avec le mot-clé extern . Alors maintenant, max peut être consulté dans d'autres fichiers.
- n est défini comme une variable entière. Le lien par défaut pour les variables définies à l'extérieur des corps de fonctions est externe .
2.cpp
#include <iostream>
using namespace std;
extern const int max;
extern int n;
static float z = 0.0;
void f(int i)
{
static int nCall = 0;
int a;
//...
nCall++;
n++;
//...
a = max * z;
//...
cout << "f() called " << nCall << " times." << endl;
}
- max est déclarée liaison externe . Une définition de correspondance pour max (avec lien externe) doit apparaître dans un fichier. (Comme dans le 1.cpp)
- n est déclaré comme ayant lien externe .
- z défini comme une variable globale avec liaison interne .
- la définition de nCall spécifie que nCall est une variable qui conserve sa valeur à travers les appels à la fonction f(). Contrairement aux variables locales avec la classe de stockage automatique par défaut, nCall ne sera initialisée qu'une seule fois au début du programme et pas une seule fois pour chaque invocation de f(). Le spécificateur de classe de stockage statique affecte la durée de vie de la variable locale et non son champ d'application.
NB: le mot-clé statique joue un double rôle. Lorsqu'il est utilisé dans les définitions de variables globales, il spécifie Lien interne . Lorsque utilisé dans les définitions des variables locales, il précise que la durée de vie de la variable va être la durée du programme au lieu de la durée de la fonction.
Espère que ça aide!
En termes de " C " (Parce que statique mot a un sens différent entre le 'C' Et 'C++')
permet de parler de la portée différente dans' C '
portée: il s'agit essentiellement de savoir combien de temps puis-je voir quelque chose et jusqu'où.
-
variable locale : champ D'application est uniquement à l'intérieur d'une fonction. Il réside dans la zone de la pile de la mémoire vive. Ce qui signifie que chaque fois qu'une fonction est appelée, toutes les variables qui sont la partie de cette fonction, y compris les arguments de fonction sont fraîchement créés et sont détruits une fois que le contrôle est en dehors de la fonction. (Parce que la pile est vidangée chaque fois que la fonction retourne)
-
variable statique: portée de ceci est pour un fichier. Il est accessible partout dans le fichier
dans lequel elle est déclarée. Il réside dans le segment de données de la RAM. Depuis ceci ne peut être accédé qu'à l'intérieur d'un fichier et donc d'un lien interne. Tout
les autres fichiers ne peuvent pas voir cette variable. En fait, le mot-clé statique est le seule façon d'introduire un certain niveau de données ou de fonction
se cacher en ' C ' -
variable globale: cette variable s'applique à l'ensemble d'une application. Elle est accessible depuis tous les où de l'application. Les variables globales résident également dans le segment de données Puisqu'il peut être accédé partout dans l'application et donc Lien externe
par défaut, toutes les fonctions sont globales. Dans le cas où, si vous avez besoin de cacher certaines fonctions dans un fichier de l'extérieur, vous pouvez préfixer la statique mot-clé à la fonction. :- )
avant de parler de la question, il est préférable de savoir le terme Unité de traduction , programme et quelques concepts de base de C++ (en fait la liaison est l'un d'eux en général) précisément. Vous devez également savoir ce qu'est un scope .
je soulignerai quelques points clés, en particulier: les personnes disparues dans les précédents réponse.
Lien est une propriété d'une nom , qui est introduit par un déclaration . Des noms différents peuvent dénoter la même entité (typiquement, un objet ou une fonction). Donc, parler de linkage d'une entité est généralement absurde, à moins que vous êtes sûr que l'entité ne sera mentionnée que par le nom unique à partir de certaines déclarations spécifiques (en général, une déclaration, tout de même).
Note objet est une entité, mais un variable ne l'est pas. Même si on parle de la liaison d'une variable, en fait le nom de l'entité dénotée (qui est introduit par une déclaration spécifique). Le lien du nom est dans l'un des trois: aucun lien, Lien interne ou lien externe.
différentes unités de traduction peuvent partager la même déclaration par en-tête/fichier source (oui, c'est la norme libellé) pour l'inclusion. Donc, vous pouvez référer le même nom dans différentes unités de traduction. Si le nom déclaré a une liaison externe, l'identité de l'entité visée par le nom est également partagé. Si le nom déclaré a un lien interne, le même nom dans différentes unités de traduction dénote des entités différentes, mais vous pouvez renvoyer l'entité dans des portées différentes de la même unité de traduction. Si le nom n'a aucun lien, vous ne pouvez tout simplement pas renvoyer l'entité à partir d'autres étendues.
(Oops... J'ai trouvé que ce que j'ai tapé ne faisait que répéter la formulation standard ...)
il y a aussi d'autres points confus qui ne sont pas couverts par la spécification linguistique.
- visibilité (d'un nom). C'est aussi une propriété de nom déclaré, Mais avec une signification différente de linkage .
- Visibilité (d'un effet secondaire) . Ce n'est pas lié à ce sujet.
- visibilité (d'un symbole). Cette notion peut être utilisée par les implémentations réelles . Dans de telles implémentations, un symbole avec une visibilité spécifique dans le code objet (binaire) est généralement la cible mappée à partir de la définition de l'entité dont les noms ont le même lien spécifique dans le code source (C++). Cependant, il n'est généralement pas garanti un contre un. Par exemple, un symbole dans une image de bibliothèque dynamique peut être spécifié seulement partagé dans cette image en interne à partir du code source (impliqué avec certaines extensions, typiquement,
__attribute__
ou__declspec
) ou des options de compilateur, et l'image n'est pas le programme entier ou le fichier objet traduit à partir d'une unité de traduction, donc aucun concept standard ne peut le décrire avec précision. Depuis le symbole n'est pas un terme normatif en C++, c'est qu'un détail d'implémentation, même si les extensions liées de dialectes peuvent ont été largement adoptées.
"1519520920 de l'Accessibilité". En C++, il s'agit généralement de propriété des membres de classe ou des classes de base , qui est encore un concept différent sans rapport avec le sujet.
- Global. En C++, "global" se réfère à quelque chose de l'espace de noms global ou de l'espace de noms global portée. , ce dernier est à peu près équivalent à indifférencié dans le langage C. À la fois en C et C++, le lien n'a rien à voir avec la portée, bien que la portée (comme le lien) soit aussi étroitement liée à un identificateur (en C) ou à un nom (en C++) introduit par une déclaration.
la règle de linkage de la portée de l'espace de noms const
variable est quelque chose de spécial (et particulièrement différent de l'objet const
déclaré dans le domaine D'application du fichier en langage C qui a également le concept de linkage d'identificateurs). Depuis ODR est appliquée par le C++, il est important de ne pas garder plus d'une définition de la même variable ou de fonction s'est produite dans l'ensemble du programme, à l'exception de inline
fonctions . S'il n'existe pas de telle règle spéciale de const
, une déclaration la plus simple de const
variable avec initialisateurs (par exemple = xxx
) dans un en-tête ou un fichier source (souvent un "fichier d'en-tête") inclus par plusieurs unités de traduction (ou inclus par une unité de traduction plus de une fois, bien que rarement) dans un programme va violer ODR, ce qui rend l'utilisation de const
variable comme remplacement de certains macros de type objet impossible.
je pense Interne et Externe de Liaison en C++ donne une explication claire et concise:
une unité de traduction se réfère à une implémentation (.C./rpc) de fichiers et de tous les tête.( h./HPP) fichiers inclus. Si un objet ou une fonction à l'intérieur une telle unité de traduction a un lien interne, puis ce spécifique le symbole n'est visible que par le linker à l'intérieur de cette unité de traduction. Si un objet ou une fonction a un lien externe, le linker peut aussi le voir lors du traitement d'autres unités de traduction. Le mot-clé statique, lorsqu'il est utilisé dans l'espace-Nom global, Force un symbole à avoir un lien interne. Le le mot-clé externe résulte en un symbole ayant une liaison externe.
le compilateur par défaut la liaison des symboles tels que:
Non-const variables globales ont une liaison externe par défaut
Les variables globales de Const ont un lien interne par défaut
Les fonctions ont un lien externe par défaut
essentiellement
-
extern linkage
la variable est visible dans tous les fichiers -
internal linkage
la variable est visible en un seul fichier.
expliquer: variables const Lien interne par défaut sauf indication contraire comme externe
- par défaut, la variable globale est
external linkage
- mais,
const
la variable globale estinternal linkage
- extra,
extern const
la variable globale estexternal linkage
Un très bon matériel sur l'établissement de liens en C++
permet de déterminer si des identificateurs ayant des noms identiques se rapportent au même objet, à la même fonction ou à une autre entité, même si ces identificateurs figurent dans des unités de traduction différentes. Le lien d'un identificateur dépend de la façon dont il a été déclaré. Il existe trois types de liens:
- internal linkage : les identificateurs ne peuvent être vus qu'au sein d'une unité de traduction.
- liaison Externe : les identificateurs peuvent être vus (et mentionnés) dans d'autres unités de traduction.
- aucun lien : les identificateurs ne peuvent être vus que dans la portée dans laquelle ils sont définis. Cents cinquante et une million neuf cent soixante mille neuf cent vingt"
c++ seulement : vous pouvez également avoir une liaison entre les fragments de code C++ et non-C++, qui est appelé liaison de langue .
Source : IBM Couplage du Programme
En C++
toute variable à portée de fichier et qui n'est pas imbriquée dans une classe ou une fonction, est visible dans toutes les unités de traduction d'un programme. Cela s'appelle lien externe parce qu'au moment du lien le nom est visible par le linker partout, externe à cette unité de traduction.
les variables Globales et les fonctions ordinaires ont une liaison externe.
statique le nom de l'objet ou de la fonction au fichier est local à l'Unité de traduction. C'est appelé liaison interne
"Liens se réfère seulement aux éléments qui ont une adresse au lien/temps de charge; ainsi, les déclarations de classe et les variables locales ont pas de lien.