Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » eigenen Header einbinden, "extern" oder nicht

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 <
010
25.08.2006, 00:10 Uhr
~Blubber2063
Gast


Das ist jetzt ohne das ichs getestet habe egal. Machs einfach so es müsste funktionieren.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
25.08.2006, 00:46 Uhr
2cHH



ok,

thnx. hab' ich eben mal (als extermbeispiel) probiert:


Code:
#include <stdio.h>

extern int n;
extern int n;
extern int n;

int main(int, char**);
int main(int, char**);
int main(int, char**);

int n;

int main(int argc, char **argv)
    {
    printf("ok\n");
    getch();
    }






gcc hat nichts daran kritisiert.

so wie ich das jetzt verstanden habe, sind funktionen immer extern (wie schon gesagt wurde) und bei variablendeklarationen merkt sich der compiler bei "extern" nur, dass die variablen "später" noch kommt. Daher macht es auch nichts aus, wenn wie bei dem beispiel oder durch die einbindung von headern der name einer variable öfter auftaucht (solange es bei einmal ohne "extern" bleibt).


hauptsache es funktioniert so
--
greetz,
2cHH
_____________

Dieser Post wurde am 25.08.2006 um 00:49 Uhr von 2cHH editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
25.08.2006, 12:46 Uhr
stephanw
localhorst


"extern" macht vor allem vor Variablen Sinn. Die Zeile "int x;" ist nämlich nicht nur Deklaration, sonder auch Definition. Würde das in mehreren Übersetzungseinheiten vorkommen, würde das Programm nicht linken, da x mehrfach definiert wird. Schreibt man "extern int x;" in den Header, heißt das: "wird irgendwoanders definiert". In irgendeinem cpp-File muss diese Definition dann natürlich auch stattfinden: "int x;" oder "int x=7;".

Bei Funktionen ist "void f();" nur eine Deklaration. Dies impliziert, dass die Definition woanders stehen muss, wenn sie nicht in der aktuellen Übersetzungseinheit zu finden ist. "extern" ist für das include in anderen Cpp-Files also überflüssig. Die Frage danach, was passiert, wenn derselbe Header im eigenen Cpp-File eingebunden wird, ist berechtigt. Vielleicht (meine Vermutung) wird in diesem Fall "extern" ignoriert, da die Definition ja in der aktuellen Übersetzungseinheit zu finden ist.

Grüße
--
Reden ist Schweigen und Silber ist Gold.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
25.08.2006, 13:01 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi,
also stephanw sagte es schon soweit richtig.

extern int x; sagt dem compiler nur - das es IRGENDWO eine Variable namens x vom Typ int gibt. WO ist ihm erstmal völlig egal. das zusammensetzen der speicherbereiche macht ja der linker. Der würde meckern wenn nicht irgendwo in einer c oder cpp datei ein "int x" vorkommt. Wenn das "int x" mehrfach vorkommt, gäbe es verschiedene Speicherbereiche namens "x" wodurch es eben zuordnungsprobleme gibt - "doppelt definiertes Symbol"

Bei Funktionen ist die Schreibweise void f(); IMMER nur eine Bekanntgabe des Namens ("Prototyp"). Da ist das "extern" implizit.

Wenn du nun in der c oder cpp datei deinen eigenen header einbindest, sagen die prototypen und extern Anweisungen dem Compiler nur - "Die Variable oder Funktion ist bekannt". Wenn sie dann in der gleichen Datei noch definiert und implementiert ist - um so besser. Wenn nicht, ist es dem Compiler egal. Der Linker sucht dann erst die Adressen raus und sucht nach dem Symbol in den c oder cpp-Dateien.

Man könnte sagen, "extern" und Prototypen sind nur reine "Namensbekanntgaben".
--
class God : public ChuckNorris { };

Dieser Post wurde am 25.08.2006 um 13:02 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
25.08.2006, 14:40 Uhr
2cHH



ok, thnx @all,

da bin ich wieder ein stück schlauer geworden
--
greetz,
2cHH
_____________
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: