wie nutze ich "extern" (programm in module teilen)
-
Hallo alle zusammen,
folgendes Problem:
ich habe 3 Dateien in meimem ProgrammA.cpp (initalisiert Variable a (z.B. int x =2) und ruft Funktion Abc auf.
B.cpp (hier wird die Funktion Initialisiert (void Abc () { cin >> x; } )
B.h ( hier ist der Prototyp der Funktion Abc deklariert (z.B. void Abc (); )
ich hoffe man kann es so verstehen - also weiter im text:
1. beim compilieren der Datei A.cpp (da befindet sich auch die main Funktion)
meldet der Kompiler das die Variable x in der Datei B.cpp nicht deklariert ist.
Vor int x = 2 habe ich auch extern hingesetzt aber is Funktioniert nicht.
Was mache ich also falsch.
In der FAQ gibt einmal so ein ähnliches Prob. es wurde aber genau so gelöst wie ich das gemacht habe - einfach ein extern vor die Variable und schon kannst du auf die Variable von überall zugreifen.2. In der Datei A.cpp benutze ich #include <iostream.h>
weil ich da cout und cin brauche
Muss ich dann auch in B.cpp #include <iostream.h> benutzen,
weil ich da auch einmal cin benutze?
Das kann doch nicht das wahre sein oder?Also wenn ihr antworten habt dann bitte, hier drunter ist noch Platz
-
Wichtigster Tip (
):
- Verwende KEINE globalen Variablen. Das ist nur in ganz
wenigen Fällen wirklich notwendig. Und ohne deinen Code
zu sehen glaub ich erstmal nicht das dein Beispiel
dazugehört.Zu 2.)
Du benötigst die Includes pro Übersetzungseinheit. Für dich
heisst das (scheinbar) pro CPP-Datei.
-
du magst recht haben was das mit den globalen variablen angeht
aber wie ich habe ein anderes beispiel als ich den hier verwendet habe
ich habe ein extra simples beispiel genommenzu 2. wieso kann sich die 2.cpp datei nicht den include code von der 1.cpp holen das ist doch speicher verscwendung oder was?
-
du magst recht haben was das mit den globalen variablen angeht
aber wie ich habe ein anderes beispiel als ich den hier verwendet habe
ich habe ein extra simples beispiel genommenzu 2. wieso kann sich die 2.cpp datei nicht den include code von der 1.cpp holen das ist doch speicher verscwendung oder was?
sorry für den Doppelpost
-
Weil beide getrennt voneinander übersetzt werden. Von dem was 1.cpp included
weiss 2.cpp nicht. In deiner IDE kannst du ja auch jede CPP-Datei für sich
alleine übersetzen, du siehst das Problem (hoffentlich).Zu den globalen Variablen. Ich seh deinen Quellcode ja nicht. Daher nochmal,
einmal definieren, üblicherweise in der CPP-Datei, und sonst mit "extern",
üblicherweise in der Header-Datei, deklarieren.
-
Aha, also muss mann in der Header datei die variablen deklarieren und in der Source Datei wenn nötig definieren
ist es so richtig?Und nochmal zu 2.
z.B.
ich habe 1 Funktion die ich in header 1 deklariere
und ich habe mein gesamtes Programm in 10 Sourcedateien untergebracht
z.B. main .cpp, createWindow .cpp, inits .cpp, shutDowns .cpp .... usw.
und jetzt muss ich in jeder cpp dadei auf diese eine funktion zugreifen-
dann müst ich ja erst mal überall #include " soundso"
eintragen.
ist ja irgendwie nicht das wahre.
Oder werden programme nicht so geteilt vieleicht mache ich einen ginerellen denkfehler
Wär nett wenn mirs jemand richtig erklärt
-
socco schrieb:
Und nochmal zu 2.
z.B.
ich habe 1 Funktion die ich in header 1 deklariere
und ich habe mein gesamtes Programm in 10 Sourcedateien untergebracht
z.B. main .cpp, createWindow .cpp, inits .cpp, shutDowns .cpp .... usw.
und jetzt muss ich in jeder cpp dadei auf diese eine funktion zugreifen-
dann müst ich ja erst mal überall #include " soundso"
eintragen.
ist ja irgendwie nicht das wahre.
Oder werden programme nicht so geteilt vieleicht mache ich einen ginerellen denkfehler
Wär nett wenn mirs jemand richtig erklärtIst aber so.

Ob deine Aufteilung sinnvoll ist, kann ich so nicht sagen.
-
socco schrieb:
Aha, also muss mann in der Header datei die variablen deklarieren und in der Source Datei wenn nötig definieren
ist es so richtig?Nein. Du definierst die globale Variable in einer Quelldatei und deklarierst sie in einem Header, den du dann überall dort einbindest, wo du die globale Variable nutzen willst.
Gruß Caipi
-
Ok ich denk ich habs jetzt
noch eine frage wenn ich die Header mit der deklarierten Variablen in 2 Source dateien einbinde nimmt er dann 2 mal den speicher der Vari oder nur einmal?
(einmal int vari in 1.cpp 4MB + int vari in 2.cpp 4MB zusammen 8MB
oder nimmt er nur einmal 4MB für die in der Header deklarierten int Vari
egal in wieviele .cpp du die header einbindest
-
socco schrieb:
Ok ich denk ich habs jetzt
noch eine frage wenn ich die Header mit der deklarierten Variablen in 2 Source dateien einbinde nimmt er dann 2 mal den speicher der Vari oder nur einmal?
(einmal int vari in 1.cpp 4MB + int vari in 2.cpp 4MB zusammen 8MB
oder nimmt er nur einmal 4MB für die in der Header deklarierten int Vari
egal in wieviele .cpp du die header einbindestIch glaube du hast es noch nicht ganz verstanden.
Beispiel:
Du hast die Module foo.cpp, bar.cpp und main.cpp und willst in allen die Variable my_global_var benutzen.
Dann kannst du (z.B.) folgendes machen:// header.hpp - hier extern-Deklaration der Variablen. Es wird _kein_ Speicher reserviert. Die Variable Wird nur bekannt gemacht. (Deklaration). extern int my_global_var; // foo.cpp #include "header.hpp" // hier kannst du jetzt my_global_var benutzen. // bar.cpp #include "header.hpp" // dito. // main.cpp int my_global_var; // Definition. (D.h. Bekanntmachung beim Compiler und Reservierung von Speicher). // hier in main kannst du my_global_var ebenfalls benutzen. int main() { ... }In obigem Beispiel definierst du die Variable my_global_var in main.cpp (D.h. hier stellst du auch Speicher für diese Variable bereit). In foo.cpp und bar.cpp bindest du nur den Header ein, in dem die Deklaration
extern int my_global_var;steht, die besagt, dass es in irgendeinem modul (in unserem Beispiel ist das main.cpp) bereits einen Bezeichner gleichen Namens (in unserem Beispiel my_global_var) gibt, für den auch bereits Speicher reserviert wurde und dass sich jeder Zugriff auf den Bezeichner aus diesen Modulen (foo.cpp oder bar.cpp) doch bitte auf den Bezeichner (und den dort reservierten Speicher) in main.cpp beziehen soll. => Du reservierst nur einmal Speicher für den Bezeichner my_global_var. Nämlich bei seiner Definition.
Gruß Caipi