411 votes

Quelle est la tringlerie externe et interne en C++

Je veux comprendre le lien externe et le lien interne et leur différence. Aussi, je veux savoir si les variables const lient en interne par défaut, sauf indication contraire en tant que extern . Qu'est-ce que ça veut dire?

353voto

dudewat Points 990

Lorsque vous écrivez un fichier d'implémentation (.rpc ou .cxx ou autre chose) de votre compilateur génère une unité de traduction. C'est l'objet de fichier à partir de votre fichier de mise en oeuvre ainsi que tous les en-têtes de vous *#include*d en elle.

Une liaison interne fait référence à tout ce uniquement dans la portée d'une unité de traduction. Liaison externe se réfère à des choses qui existent au-delà d'un particulier de l'unité de traduction. En d'autres termes, accessible par le biais de l'ensemble du programme, qui est la combinaison de toutes les unités de traduction (ou les fichiers objets).

340voto

Motti Points 32921

Comme dudewat dit externe de liaison signifie que le symbole (fonction ou une variable globale est accessible tout au long de votre programme et interne de liaison signifie que c'est uniquement accessible dans une unité de traduction. Vous pouvez contrôler explicitement le lien d'un symbole à l'aide de la extern et static mots-clés et la liaison par défaut est extern pour les non-const symboles et static (interne) const symboles.

// 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 une liaison interne, il est préférable d'utiliser des espaces de noms anonymes dans lesquelles vous pouvez également mettre classes. Le lien pour les espaces de noms a changé entre le C++98 et C++11, mais la chose principale 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 { };
}

125voto

mag Points 3381
  • Une variable globale est une liaison externe par défaut. Son champ d'application peut être étendu à d'autres fichiers que contient, en donnant un correspondant externe de la déclaration dans l'autre fichier.
  • La portée d'une variable globale peut être limitée vers le fichier contenant sa déclaration par la préfixation de la déclaration avec le mot-clé static. Ces variables sont dit d'avoir une liaison interne.

Considérons 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);
    //...
}
  1. La signature de la fonction f déclare f comme une fonction de liaison externe(par défaut). Sa définition doit être fournie plus tard dans le même fichier ou dans d'autres unités de traduction (ci-dessous).
  2. max est défini comme une constante entière. La liaison par défaut pour les constantes est interne. Alors que max peut être consulté dans d'autres fichiers. Ses établit un lien externe avec le mot-clé extern.
  3. n est défini comme une variable de type entier. La liaison par défaut pour les variables définies à l'extérieur de la fonction des organes externes.

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;
}
  1. max est déclaré d'avoir une liaison externe. Un correspondant de la définition de max(avec liaison externe) doit figurer dans un fichier. (Comme dans 1.cpp)
  2. n est déclarée d'avoir une liaison externe.
  3. z est défini comme une variable globale avec une liaison interne.
  4. La définition de nCall spécifie nCall être une variable conserve sa valeur entre les appels de la fonction f(). À la différence des variables locales à la valeur par défaut auto de stockage de classe, nCall sera initialisé qu'une seule fois au début du programme, et non pas une fois pour chaque appel de f(). La classe de stockage de spécificateur de statique affecte la durée de vie de la variable locale et non pas de son champ d'application.

NB: Le mot-clé static joue un double rôle. Lorsque utilisé dans les définitions de variables globales, il spécifie une liaison 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érons que ça aide!

31voto

Libin Jose Points 171

En termes de " C " (Parce que statique mot a un sens différent entre le 'C' Et 'C++')

Permet de parler de différents portée en "C"

CHAMP d'application: Il s'agit essentiellement combien de temps puis-je voir quelque chose, et dans quelle mesure.

  1. Variable locale : Champ d'application est uniquement à l'intérieur d'une fonction. Elle réside dans la PILE de RAM. Ce qui signifie que chaque fois qu'une fonction est appelée, toutes les variables qui sont le cadre de cette fonction, y compris les arguments de la 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 vidée à chaque fois que la fonction retourne)

  2. Variable statique: le Champ d'application de la présente est pour un fichier. Il est accessible dans tout le fichier
    dans lequel elle est déclarée. Il réside dans le segment de DONNÉES de la mémoire RAM. Depuis ce ne peut être accédé qu'à l'intérieur d'un fichier, et donc une liaison INTERNE. Tout
    les autres fichiers ne peuvent pas voir cette variable. En fait, mot-clé STATIC est la seule façon dont nous pouvons introduire un certain niveau de données ou de la fonction
    se cachant dans 'C'

  3. Variable globale: le Champ d'application de la présente est pour toute application. Elle est accessible depuis tous les où de l'application. Les variables globales réside également dans le segment de DONNÉES Puisque l'on peut accéder, en tous lieux, dans la demande et, partant, Liaison EXTERNE

Par défaut, toutes les fonctions sont mondiaux. Dans le cas où, si vous avez besoin de masquer certaines fonctions dans un fichier à partir de l'extérieur, vous pouvez ajouter un préfixe de la statique mot-clé à la fonction. :-)

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