Extern in c ++

Extern in c ++
Das Wort "extern" in C ++ ist ein Spezifizierer. Die Verwendung in C ++ wird in diesem Artikel für Variablen und Funktionen erläutert. Erstens werden die Bedeutungen von Deklaration und Definition in C ++ angegeben. Betrachten Sie die folgenden Codezeilen:
int it;
char fn (int itg, char ch);
es = 5;
char fn (int itg, char ch)
char var = 'o';
if (itg == 1 && ch == 'a')
var = 'z';
return var;

Die erste Zeile ist eine variable Deklaration. Die zweite Zeile wäre eine Funktionssignatur gewesen, wenn sie nie mit einem Semikolon gefolgt von einem Funktionskörper gefolgt wäre. Diese zweite Zeile, die mit einem Semikolon endet, ist ein Funktionsprototyp. Es ist auch eine Funktionserklärung. Die dritte Zeile weist der Ganzzahlvariablen einen Wert zu: Dies ist eine variable Initialisierung, kann jedoch in etwa als variable Definition angesehen werden. Der Rest des Codes ist eine Funktionsdefinition. Es beginnt mit der Funktionssignatur, gefolgt vom Funktionskörper.

In C ++ gibt es eine Nuance, wenn es sich um die Erklärung und Definition handelt. Die folgende Erklärung ist eine Variablenerklärung:

int it = 5;

Eine vollständige Variablenerklärung wie diese, bei der die Variable eingeführt und dann einen Wert zugewiesen wird, ist immer noch eine Variablenerklärung. Eine variable Erklärung kann also nur die Variable oder die Einführung mit der Definition einführen.

Der folgende Code (von oben kopiert) ist eine Funktionserklärung:

char fn (int itg, char ch)
char var = 'o';
if (itg == 1 && ch == 'a')
var = 'z';
return var;

Eine vollständige Funktionserklärung wie diese, bei der ihre Signatur die Funktion einführt und dann von der Funktionskörper folgt, ist immer noch eine Funktionserklärung. Eine Funktionserklärung kann also nur der Funktionsprototyp sein oder die Funktionssignatur zusammen mit dem Funktionskörper sein.

Eine Erklärung kann also mit oder ohne Definition sein. Eine Definition ist wie ein Teil einer Erklärung. Mit der Variablen ist es tatsächlich die Initialisierung, zum ersten Mal einen Wert zuzuweisen und nicht wirklich definiert. Wenn eine Variable zum ersten Mal ohne Initialisierung deklariert wird, ist ihre Speicherstelle bereits bereitgestellt, aber sie ist leer. Ein Wert in einem Wert am Standort ist eine Initialisierung, die die Definition abschließt.

Traditionell hat eine einfache C ++ - Anwendung drei Dateien. Es hat eine Hauptdatei, die als erste Datei bezeichnet werden kann. Es hat eine zweite Datei und eine Header -Datei. Die Verwendung des externen Spezifizierers kann die Anzahl der Dateien auf zwei reduzieren (von drei). In diesem Artikel wird die Verwendung des externen Spezifizierers mit Variablen und Funktionen erläutert, um die Header -Datei zu vermeiden. Hinweis: In C ++ - Vokabular werden solche beiden Dateien als Übersetzungseinheiten bezeichnet.

Artikelinhalt

  • Header -Datei ohne extern
  • Extern ohne Header -Datei
  • Konstant und extern
  • extern und statisch
  • Abschluss

Header -Datei ohne extern

Traditionell hat eine einfache C ++ - Anwendung drei Dateien: die Hauptdatei mit der Funktion main (), die als erste Datei, eine zweite Datei und eine Header -Datei bezeichnet werden kann. Die Header -Datei sollte die Erklärungen von Variablen und Funktionen ohne ihre Definitionen haben. Die Definitionen der Header -Deklarationen sollten in der zweiten Datei liegen. Am oberen in der ersten Datei muss es geben,

#include "Kopf.HH "

Wo Kopf.HH ist der Name der Header-Datei und befindet sich im Benutzer-Heimverzeichnis. Die Richtlinie inklusive endet nicht mit einem Semikolon. In dieser Situation sollten die Variablendeklarationen ohne Definitionen und die Funktionsprototypen ohne Funktionsdefinitionen in der Header -Datei nicht dem externen Spezifizierer vorausgehen. Und die Anwendung sollte funktionieren.

Illustration
Die obige Variable und Funktion werden hier zur Illustration verwendet.

Geben Sie den folgenden Code in einen Texteditor ein und speichern Sie ihn im Benutzer-Heimverzeichnis mit dem Namen, dem Kopf.HH:

int it = 5;
char fn (int itg, char ch);

Es gibt nur zwei Aussagen im Header. Geben Sie als nächstes Folgendes in ein Dokument des Texteditors ohne Titel ein und speichern Sie im Benutzer-Home-Verzeichnis mit dem Namen zweiten.CPP:

char fn (int itg, char ch)
char var = 'o';
if (itg == 1 && ch == 'a')
var = 'z';
return var;

Geben Sie als Nächst.CPP:

#include "Kopf.HH "
#enthalten
Verwenden von Namespace STD;
int main ()

Cout << it << endl;
Cout << fn(1, 'a') << endl;
Rückkehr 0;

Kompilieren Sie die Anwendung mit dem folgenden Terminalbefehl:

G ++ zuerst.CPP Sekunde.CPP -o vollständig.exe

Führen Sie die Anwendung mit aus,

./vollständig.exe

Die Ausgabe ist:

5
z

Leider erlaubt die Header -Datei keine einfache Deklaration einer Variablen (e.G., es) ohne Initialisierung. Dieses Problem kann jedoch wie unten gezeigt gelöst werden.

Extern ohne Header -Datei

Die Header -Datei kann beseitigt werden, wenn der externe Spezifizierer angemessen verwendet wird. In dieser Situation wird es eine Erklärung für die Variable und die Funktion geben, jede ohne Definition in der ersten (Haupt-) Datei. Jeder wird von einem externen vorausgehen.

Illustration
Geben Sie den folgenden Code in einen Texteditor ein und speichern Sie ihn zuerst im Benutzer-Heimverzeichnis mit dem Namen.CPP:

#enthalten
Verwenden von Namespace STD;
extern int it;
externer char fn (int itg, char ch);
int main ()

Cout << it << endl;
Cout << fn(1, 'a') << endl;
Rückkehr 0;

Geben Sie als Nächstes Folgendes in ein Dokument ohne Titel des Texteditors ein und speichern.CPP:

int it = 5;
char fn (int itg, char ch)
char var = 'o';
if (itg == 1 && ch == 'a')
var = 'z';
return var;

Die Definition der Variablen und der Funktion fand in der zweiten Datei statt. In der ersten Datei wurden sie ohne Definition deklariert. In dieser neuen Anwendung wurde kein Header aufgenommen. Es sind nur zwei Dateien beteiligt. Beachten Sie, dass die Variable in der zweiten Datei vollständig deklariert wurde, jedoch ohne das Wort extern. Auch die Funktion wurde ohne das Wort extern vollständig deklariert. Das Wort "extern" muss jedoch den Teilerklärungen in der ersten Datei vorausgehen.

Kompilieren Sie die Anwendung mit dem folgenden Terminalbefehl:

G ++ zuerst.CPP Sekunde.CPP -o vollständig.exe

Ausführen der Anwendung mit,

./vollständig.exe

Die Ausgabe ist:

5
z

Gleich wie zuvor, aber ohne Header -Datei.

Daher verknüpft der externe Spezifizierer Erklärungen zwischen zwei Dateien. Eine Datei sollte ohne Definition und mit externer Deklaration abgeschlossen werden. Die andere Datei sollte eine Definition durchführen, die eine vollständige Erklärung wäre, jedoch ohne extern.

Header -Datei und Extern

Die obige Anwendung hatte das Problem, dass die Variable in der Header -Datei vollständig deklariert werden musste. Um die Deklaration einer Variablen in einer Header -Datei ohne Definition zu erhalten. Also, wenn es gibt,

extern int it;

In der Header -Datei würde es geben

int it = 5;

in der zweiten Datei, und es würde noch geben

#include "Kopf.HH "

Oben in der ersten Datei (Hauptdatei).

Konstant und extern

Unter normalen Umständen muss eine Konstante initialisiert werden. Zum Beispiel,

const char ch = 'e';

ist erlaubt und

const char ch;

Ist nicht erlaubt.

Mit dem externen Spezifizierer kann jedoch eine Konstante ohne Initialisierung in den ersten und zweiten Dateien deklariert werden. Wenn also in der ersten Datei, gibt es

externe const char ch;

In der zweiten Datei wird es geben

char ch = 'e';

Ohne const in der zweiten Datei. CH in beiden Dateien ist dieselbe Entität.

Ersetzen Sie den ersten.CPP -Datei mit folgenden Inhalten und speichern:

#enthalten
Verwenden von Namespace STD;
externe const char ch;
int main ()

Cout << ch << endl;
Rückkehr 0;

Ersetzen Sie die zweite.CPP -Datei mit folgenden Inhalten und speichern:

char ch = 'e';

Kompilieren Sie die Anwendung mit dem folgenden Terminalbefehl:

G ++ zuerst.CPP Sekunde.CPP -o vollständig.exe

Ausführen der Anwendung mit,

./vollständig.exe

Die Ausgabe sollte sein, e.

extern und statisch

Speicherklassenspezifizierer in C ++ sind statisch, thread_local, extern, veränderlich. Nicht mehr als eine davon kann in einer bestimmten Erklärung verwendet werden. In einigen Fällen kann Thread_local und Static jedoch vor einer Entitätserklärung oder Thread_Local und Extern vor einer Entitätserklärung erscheinen. Extern und statisch können also niemals als Antriebsmittel für eine Erklärung vorhanden sein.

Abschluss

Der externe Spezifizierer verknüpft zwei Erklärungen derselben Entität, die in zwei verschiedenen Dateien enthalten sind. Die Erklärung mit dem externen Spezifizierer sollte nicht initialisiert oder definiert werden. Die Erklärung in der anderen Datei, in der der externe Spezifizierer nicht verfügt, sollte initialisiert oder definiert werden. Dieses Schema gilt für Variablen und Funktionen. Es beseitigt die Notwendigkeit einer Header -Datei für die Variablen und Funktionen von Interesse. Es ermöglicht eine Konstante, ohne Initialisierung in einer Datei und in der anderen Datei deklariert zu werden. Wenn der Programmierer eine Header -Datei möchte, muss der Programmierer extern für die Variable in der Header -Datei verwenden, um eine Variable in der Header -Datei ohne Initialisierung zu haben.