Wie man Variablen zwischen Dateien in C++ teilt: Leitfaden zu extern

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Warum Ihr Code nicht kompiliert: Das Geheimnis von extern in C++

\n\n

Haben Sie jemals ein sauberes C++-Programm geschrieben, es in mehrere Dateien aufgeteilt, kompiliert – und eine Wand von Fehlern wie multiple definition of 'myVariable' oder undefined reference to 'myVariable' erhalten? Kommt Ihnen bekannt vor? Wenn ja, sind Sie nicht allein. Die Frage "How do I use extern to share variables between source files?" gehört zu den beliebtesten auf Stack Overflow mit Zehntausenden von Aufrufen.

\n\n

Das Problem ist einfach: Wenn ein Projekt wächst, ist es unmöglich, den gesamten Code in einer einzigen main.cpp zu halten. Aber wie erreicht man, dass eine in config.cpp deklarierte Variable in game.cpp und render.cpp sichtbar ist? Die Intuition sagt: "Deklariere sie einfach global!" – aber der Compiler denkt anders. Zur Hilfe kommt das kleine, aber mächtige Schlüsselwort extern. Lassen Sie uns verstehen, wie es in der Praxis funktioniert, damit Sie nie wieder beim Linken verwirrt sind.

\n\n

Was ist extern und warum wird es benötigt?

\n\n

In C++ muss jeder Name (Variable, Funktion, Klasse) vor der Verwendung deklariert (declared) und genau einmal definiert (defined) werden. Eine Definition ist das, was Speicher zuweist. Eine Deklaration ist lediglich ein Versprechen an den Compiler: "Keine Sorge, die Definition existiert irgendwo in einer anderen Datei, ich zeige dir nur den Typ und den Namen."

\n\n

Das Schlüsselwort extern ist genau ein solches Versprechen. Es sagt dem Compiler: "Diese Variable ist woanders definiert, weise hier keinen Speicher für sie zu – gib mir einfach Zugriff auf sie."

\n\n

Ohne extern führt jeder Versuch, eine globale Variable in zwei .cpp-Dateien zu deklarieren, zu einem Linker-Fehler: zwei Definitionen – zwei Speicherbereiche – Konflikt.

\n\n

Die Drei-Dateien-Regel: Wie man Code organisiert

\n\n

Das Standardmuster zum Teilen von Variablen zwischen Dateien in C++ sieht so aus:

\n\n
    \n
  1. Definitionsdatei (*.cpp) – enthält eine Definition der Variable.
  2. \n
  3. Header-Datei (*.h) – enthält die extern-Deklaration der Variable.
  4. \n
  5. Jede andere .cpp-Datei – bindet den Header ein und verwendet die Variable.
  6. \n
\n\n

Beispiel 1: Eine ganze Zahl teilen

\n\n

Stellen Sie sich vor, wir schreiben ein Spiel und möchten eine globale Punktzahl in einer separaten Datei speichern. So macht man es richtig.

\n\n

Datei: globals.cpp – hier lebt die echte Variable:

\n
// globals.cpp\n#include "globals.h"\n\nint gameScore = 0;  // Definition: Speicher wird hier zugewiesen
\n\n

Datei: globals.h – Deklaration für alle anderen:

\n
// globals.h\n#ifndef GLOBALS_H\n#define GLOBALS_H\n\nextern int gameScore;  // Deklaration: "Suche die Definition in einer anderen .cpp"\n\n#endif // GLOBALS_H
\n\n

Datei: main.cpp – wir verwenden die Variable:

\n
// main.cpp\n#include <iostream>\n#include "globals.h"\n\nvoid updateScore(int points) {\n    gameScore += points;  // Funktioniert! extern hat Zugriff gewährt\n}\n\nint main() {\n    gameScore = 100;\n    updateScore(50);\n    std::cout << "Score: " << gameScore << std::endl; // Gibt 150 aus\n    return 0;\n}
\n\n

Datei: display.cpp – eine weitere Datei, die Zugriff benötigt:

\n
// display.cpp\n#include <iostream>\n#include "globals.h"\n\nvoid showScore() {\n    std::cout << "Current score: " << gameScore << std::endl;\n}
\n\n

Beachten Sie: gameScore ist genau einmal definiert – in globals.cpp. An allen anderen Stellen verwenden wir extern int gameScore (über den Header).

\n\n

Häufiger Fehler Nr. 1: Definition in der Header-Datei

\n\n

Anfänger schreiben oft Folgendes in eine .h-Datei:

\n
// SCHLECHT: ba                

Blogs

Buchempfehlungen