Schlüsselwort extern
-
Hallo,
was heisst das Schlüsselwort extern genau. Man legt da mal eine Variable für
später an , will sie aber momentan gar nicht benutzen ?Kann man sie später auch definieren ? Wenn man das kann , könnte
man doch gleich int x; schreiben.
-
Das geht z.b. nicht
#include <iostream> void main(void) { extern int x; x=7; }
-
Man möchte eine Variable deklarieren, aber definiert werden soll sie in einen anderen Übersetzungseinheit.
#include <iostream> extern int x; void main(void) { std::cout << x; // 2 }
andere cpp:
int x = 2;
-
Warum möchte man sie denn deklarieren ?
Ist mir noch nicht ganz klar.
-
Wirklich brauchen tut man das oftmals nicht. Es ist eine globale Variable über mehrere Quelldateien.
Ich persönlich habe das noch nie gebraucht. Nett, wenn mans kennt, aber eben einsetzen sollte man es eher nicht. (ausser natürlich in Ausnahmefällen).
-
extern ist in erster Linie dafür da, eine externe Bindung zu erzwingen und kann zweitrangig aus einer Definition eine Deklaration machen -- wie schon gesagt wurde. Da auf "globaler Ebene" fast alles automatisch externe Bindung hat, muss man es nicht oft einsetzen. Hier mal ein halbwegs brauchbares Beispiel:
bibliothek.hpp
#ifndef BIBLIOTHEK_HPP_INCLUDED #define BIBLIOTHEK_HPP_INCLUDED extern const char version_string[]; // <-- extern nötig extern void mach_was(); // <-- extern überflüssig #endif
Das erste ist eine Deklaration von version_string als ein Array mit unbekannter Länge (unvollständiger Typ). Extern wird hier benötigt aus zwei Gründen: Const impliziert bei C++ auf globaler Ebene interne Bindung und "extern" sorgt hier wieder für externe Bindung. Außerdem soll es ja eine Deklaration sein.
Das zweite extern ist überflüssig, da Funktionen in nicht-anonymen Namensräumen oder globale automatisch eine externe Bindung besitzen.
bibliothek.cpp
#include "bibliothek.hpp" // Definition von version_string mit vollständigem Typ // const char[12] (Compiler zählt für uns) wegen // Initialisierer extern const char version_string[] = "Hallo Welt!"; void mach_was() { /* kein bock */ }
anwendung.cpp
#include <iostream> #include "bibliothek.cpp" int main() { std::cout << version_string << '\n'; mach_was(); }
Wenn nicht 100% klar ist, was "externe/interne Bindung" ist, sollte man das mal nachlesen. Es taucht wie Definition vs Deklaration typischerweise in Kapiteln zur "getrennten Übersetzung" in Lehrbüchern auf.
blurry33 schrieb:
Warum möchte man sie denn deklarieren ?
Ist mir noch nicht ganz klar.Damit man sie in einer Übersetzungseinheit nutzen kann, aber nicht angelegt wird. Wenn Du mehr als nur eine Definition von so einer globalen Variable
bringst, wird sich der Linker beschweren "multiple definition".Mit einer Deklaration machst Du dem Compiler mit etwas neuem bekannt, so dass es eventuell eingeschränkt nutzbar wird.
Mit einer Definition legst Du ein Objekt/eine Funktion an bzw verrätst die Details einer Klasse/Struktur.
Das ist ein recht wichtiges Konzept, was man drauf haben sollte. Nachlesen!
Gruß,
SP