C++ Newibie Frage

Gast #3644762
Lesenswert?

Hallo,

ich habe folgendes Problem in C++:

ich habe eine main.c:
1
int var1;
2
int main(void)
3
{
4

5
var1 = 10;
6
}

In einer berechne.c arbeite ich mit weiteren Funktionen:
1
void doberechnung(void)
2
{
3
int x;
4
x = var1;
5
}


Fehlermeldung ist immer
"var1" ist undeclared, dabei ist doch var1 in der main.c global 
definiert!??

Gruß
#3644770
Lesenswert?

Simeone schrieb:

> "var1" ist undeclared, dabei ist doch var1 in der main.c global
> definiert!??

Die ineterssiert aber den Compiler nicht, wenn er berechne.c compiliert.
Jedes C-File wird für sich alleine compiliert, ohne Ansehen aller 
anderen C-Files.
1
extern int var1;
2

3
void doberechnung(void)
4
{
5
  int x;
6
  x = var1;
7
}

Wie man das dann in der Praxis vernünftig macht, findest du zb in der
FAQ
im Abschnitt 9. "Globale Variablen"
Gast #3644773
Lesenswert?

Jede C-Datei oder auch C++-Datei wird für sich übersetzt. D.h. während 
die eine Datei übersetzt wird, sind dem Compiler keinerlei Deklarationen 
oder Definitionen aus anderen Dateien bekannt.
Diese "Zusammenführung" geschieht erst am Schluß, bevor das gesamte 
Programm gebaut wird, im sog. "Linker" (was man ganz lose auch als 
"Zusammenführer" übersetzen könnte.

Was Du brauchst ist eine Deklaration in einem H-File (und ein C-Buch).

Dazu schreibst Du in einer H-Datei
1
extern int var1;

und fügst diese mit dem "#include"-Präprozessorbefehl in berechne.c ein.

Übrigens sehe ich im Code und an den Dateiendungen nur C und nicht C++.
Gast #3644775
Lesenswert?

Translation units in C (das sind deine beiden .c-Dateien) werden 
unabhängig voneinander kompiliert.

Wenn der Compiler gerade berechne.c verarbeitet, schaut er sich main.c 
nicht an. Auch wenn er main.c gerade davor verarbeitet haben sollte, 
vergißt er am Ende alles, was darin stand, und beginnt die berechne.c 
wieder mit völlig leerem "Gedächtnis".
Gast #3645325
Lesenswert?

Daniel A. schrieb:
> In main.h kommt
> int main( void );

Wozu? In einem vernünftig aufgebautem Programm inkludiert kein andere 
C-Datei eine main.h, denn das wäre zwangsläufig eine wechselseitige bzw. 
zyklische Abhängigkeit. Und eine Vorwärtsdeklaration der main-Funktion 
braucht man selbst in main.c nicht, da main() ausschließlich vom 
Startupcode (des Compilers) aufgerufen wird ...
Gast #3645352
Lesenswert?

Karl Heinz schrieb:
> extern int var1;
>
> void doberechnung(void)
> {
>   int x;
>   x = var1;
> }
Das extern kann man sich auch einfach sparen und den Wert übergeben. Ist 
meiner Meinung nach viel sauberer als irgendwo eine Variable zu haben, 
die dann irgendwo anders benutzt wird...
Mach es ordentlich!
1
void doberechnung(int var)
2
{
3
  int x = var;
4
}
Und ansonsten der übliche Tipp: Lies ein C- bzw. C++-Buch!
(http://www.amazon.de/Der--Programmierer-professionell-anwenden-L%C3%B6sungen/dp/3446438947/ref=sr_1_1?ie=UTF8&qid=1399393473&sr=8-1&keywords=der+c%2B%2B+programmierer)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren