Wann extern in C++ verwendet werden sollte

Lesezeit: 6 Minuten

Wann extern in C verwendet werden sollte
Aslan986

Ich lese “Think in C++” und es hat gerade das eingeführt extern Erklärung. Zum Beispiel:

extern int x;
extern float y;

Ich glaube, ich verstehe die Bedeutung (Deklaration ohne Definition), aber ich frage mich, wann es sich als nützlich erweist.

Kann jemand ein Beispiel geben?

  • Ich musste eine Definition mit liefern extern bei mehreren Gelegenheiten. Microsoft-Tools erzeugten einen Verknüpfungsfehler für fehlende Symbole, wenn die Tabellen in einer anderen Quelldatei nur definiert wurden. Das Problem war, der Tisch war const und der C++-Compiler hat es zu befördert static in der Übersetzungseinheit. Siehe zum Beispiel ariatab.cpp und kalynatab.cpp.

    – jww

    12. August 2017 um 6:43 Uhr


  • Und ich denke, Niks Antwort ist die richtige, weil er anscheinend der einzige ist, der eine C++-Frage beantwortet hat. Alle anderen scheinen zu einer C-Frage abgeschweift zu sein.

    – jww

    12. August 2017 um 6:56 Uhr

  • Ab C++17, inline kann ein besserer Weg sein, um das zu erreichen, was Sie tun möchten extern. Mit inline, können Sie Globals in Headern definieren und müssen sich keine Gedanken über Probleme mit mehreren Definitionen machen. stackoverflow.com/questions/38043442/…

    – Joshua Jürgensmeier

    19. November 2020 um 20:28 Uhr


1647166808 100 Wann extern in C verwendet werden sollte
Traumlax

Dies ist nützlich, wenn Sie globale Variablen haben. Sie erklären die Existenz von globalen Variablen in einem Header, sodass jede Quelldatei, die den Header enthält, davon weiß, aber Sie müssen ihn nur einmal in einer Ihrer Quelldateien „definieren“.

Zur Verdeutlichung mit extern int x; teilt dem Compiler mit, dass ein Objekt vom Typ int namens x existiert irgendwo. Es ist nicht die Aufgabe des Compilers zu wissen, wo es existiert, er muss nur den Typ und den Namen kennen, damit er weiß, wie es verwendet wird. Sobald alle Quelldateien kompiliert wurden, löst der Linker alle Verweise auf auf x zu der einen Definition, die es in einer der kompilierten Quelldateien findet. Damit es funktioniert, muss die Definition der x Die Variable muss über eine sogenannte „externe Verknüpfung“ verfügen, was im Grunde bedeutet, dass sie außerhalb einer Funktion (im sogenannten „Dateibereich“) und ohne die deklariert werden muss static Stichwort.

Header:

#ifndef HEADER_H
#define HEADER_H

// any source file that includes this will be able to use "global_x"
extern int global_x;

void print_global_x();

#endif

Quelle 1:

#include "header.h"

// since global_x still needs to be defined somewhere,
// we define it (for example) in this source file
int global_x;

int main()
{
    //set global_x here:
    global_x = 5;

    print_global_x();
}

Quelle 2:

#include <iostream>
#include "header.h"

void print_global_x()
{
    //print global_x here:
    std::cout << global_x << std::endl;
}

  • Danke. Wenn ich also eine globale Variable in einer Header-Datei ohne das Schlüsselwort extern deklariere, sehen die Quelldateien, die den Header enthalten, ihn nicht?

    – Aslan986

    2. Mai 2012 um 21:42 Uhr

  • Sie sollten keine globalen Variablen in einem Header deklarieren, da dann, wenn 2 Dateien dieselbe Header-Datei enthalten, diese nicht verknüpft wird (der Linker gibt einen Fehler über „doppeltes Symbol“ aus).

    – Kuba

    2. Mai 2012 um 21:44 Uhr

  • @Aslan986: Nein, etwas Schlimmeres passiert. Jede Quelldatei, die den Header enthält, hat seine eigene Variable, sodass jede Quelldatei unabhängig kompiliert wird, aber der Linker wird sich beschweren, weil zwei Quelldateien dieselben globalen Bezeichner haben.

    – Traumlax

    2. Mai 2012 um 21:46 Uhr

  • Wenn Sie das Wort “extern” nicht verwenden, dann existiert die Variable jetzt. Wenn Sie “extern” verwenden, ist es ein “Hey, da ist diese Variable woanders”. Es tut mir leid, dass ich nicht geantwortet habe, ob es sich um eine Definition oder eine Deklaration handelt, da ich bei diesen beiden immer verwirrt bin.

    – Kuba

    2. Mai 2012 um 21:55 Uhr

  • @CCJ: Der Include-Wächter funktioniert nur für die Quelldatei, die ihn enthält. Es verhindert, dass derselbe Header zweimal in derselben Quelldatei enthalten ist (nur für den Fall, dass andere Header ihn ebenfalls enthalten usw.). Selbst mit Include-Guards hat jede Quelldatei, die den Header enthält, immer noch ihre eigene Definition.

    – Traumlax

    20. Juni 2018 um 0:23 Uhr

Es ist nützlich, wenn Sie eine Variable zwischen einigen Modulen teilen. Sie definieren es in einem Modul und verwenden extern in den anderen.

Zum Beispiel:

in file1.cpp:

int global_int = 1;

in file2.cpp:

extern int global_int;
//in some function
cout << "global_int = " << global_int;

  • Diese Antwort ist richtiger als die akzeptierte, da sie keine Header-Datei verwendet und deutlich macht, dass sie nur nützlich ist, wenn sie zwischen wenigen Modulen geteilt wird. Für größere Anwendungen ist es besser, zum Beispiel eine ConfigManager-Klasse zu verwenden.

    – Zac

    16. März 2015 um 14:53 Uhr

  • Gibt es irgendwelche Fallstricke, wenn Namensräume involviert sind, global_int befindet sich im globalen Namespace, wenn ich es in file2.cpp in einem Namespace-Abschnitt verwenden würde, müsste ich es korrekt ausrichten? dh namespace XYZ{ void foo(){ ::global_int++ } };

    – jxramos

    29. September 2015 um 23:53 Uhr


  • @Zac: Auf der anderen Seite, indem Sie eine globale Variable nicht in einem Header deklarieren, haben Sie es versehentlich viel schwieriger gemacht, festzustellen, wo sie tatsächlich definiert ist. Normalerweise, wenn Sie eine globale Variable sehen, die in deklariert ist abc.hes besteht eine gute Chance, dass es in definiert wird abc.cpp. Eine gute IDE wird immer helfen, aber gut organisierter Code ist immer eine bessere Lösung.

    – Traumlax

    5. November 2015 um 21:35 Uhr


  • ohne extern in file2.cpp , kann immer noch darauf zugreifen global_int nach einschließen. warum muss ich das haben?

    – Tom Sawyer

    26. April 2020 um 19:32 Uhr

  • @TomSawyer, den Sie in diesem Fall nicht einbeziehen möchten. file1.cpp und file2.cpp sollen unterschiedliche Kompilierungseinheiten sein. Es wäre sehr unüblich, eine .cpp-Datei einzufügen.

    – Daniel Bauer

    30. Oktober 2020 um 9:19 Uhr

1647166809 147 Wann extern in C verwendet werden sollte
Trevor

Es dreht sich alles um die Verknüpfung.

Die vorherigen Antworten lieferten gute Erklärungen zu extern.

Aber ich möchte einen wichtigen Punkt hinzufügen.

Du fragst nach extern in C++nicht in C und ich weiß nicht, warum es keine Antwort gibt, in der der Fall erwähnt wird extern kommt mit const in C++.

In C++, a const Variable hat standardmäßig eine interne Verknüpfung (nicht wie C).

Dieses Szenario wird also dazu führen Verknüpfungsfehler:

Quelle 1 :

const int global = 255; //wrong way to make a definition of global const variable in C++

Quelle 2 :

extern const int global; //declaration

Es muss so sein:

Quelle 1 :

extern const int global = 255; //a definition of global const variable in C++

Quelle 2 :

extern const int global; //declaration

  • Warum ist es falsch, während es in C++ funktioniert, ohne ‘extern’ in den Definitionsteil aufzunehmen?

    – iartist93

    17. November 2016 um 19:17 Uhr

  • Ich scheine diesen Verknüpfungsfehler in Visual Studio mit Visual Micro nicht zu haben. Was vermisse ich?

    – Craig.Feied

    18. August 2017 um 3:44 Uhr

  • @lartist93 @Craig.Feied Ich glaube, Sie müssen es vielleicht noch einmal sorgfältig überprüfen. Selbst wenn der Compiler keinen Verknüpfungsfehler meldet, können Sie überprüfen, ob beide Objekte in beiden Quellen gleich sind, ohne extern definiert? Sie könnten dies tun, indem Sie den Wert von ausdrucken global in Quelle 2.

    – Trevor

    21. Mai 2018 um 1:15 Uhr

  • Bestätigen, in MSVS 2018 dort ist ein Verknüpfungsfehler, wenn extern wird weggelassen const int global = 255;.

    – Evg

    1. September 2018 um 13:14 Uhr

  • Ich habe gesehen extern Wird in C++-Servercode verwendet, wo der Client in C geschrieben ist. Ich dachte immer, es wurde getan, um die C++-Funktion für C verfügbar zu machen, das sonst nicht in der Lage wäre, darauf zu verlinken. Ist das richtig ?

    – wg

    20. Januar um 16:59 Uhr

Dies ist nützlich, wenn Sie eine globale Variable haben möchten. Sie definieren die globalen Variablen in einer Quelldatei und deklarieren sie extern in einer Header-Datei, sodass jede Datei, die diese Header-Datei enthält, dieselbe globale Variable sieht.

997160cookie-checkWann extern in C++ verwendet werden sollte

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy