Forum: Compiler & IDEs globaler socket descriptor


von qwertz (Gast)


Lesenswert?

Hallo,

ich öffne in einer Funtkion mit:
skt = socket( PF_CAN, SOCKET_RAW, CAN_RAW );
einen Socket für die CAN Kommunikation.

Da ich dieses skt ständig benötige und nicht jedes mal an alle
Funktionen übergeben möchte, dachte ich mir diesen global zu definieren:
header.h
int skt = 0;

nun kommen die Fehlermeldungen:
"multiple definition of `skt'"
"first defined here"
"collect2:error:ld returned 1 exist status"

Ich kann aber nicht zu dem Fehler gehen, denn es heißt weiter:
"Datei nicht gefunden:(.bss+0x0)"

Was mache ich falsch?
Ist es überhaupt ratsam diesen descriptor global zu definieren?

Danke

von Peter II (Gast)


Lesenswert?

qwertz schrieb:
> Funktionen übergeben möchte, dachte ich mir diesen global zu definieren:
> header.h
> int skt = 0;

so macht man es aber nicht. Die Variabel muss ein ein C datei zu hause 
sein.

global.c

int skt = 0 ;


global.h

extern int skt;


und jetzt kannst du überall global.h einbinden.

von AN D. (schoensittich)


Lesenswert?

Du definierst die Variable in einer Header-Datei. Diese Datei wird 
wahrscheinlich mehrfach eingebunden und folglich wird die Variable an 
unterschiedlichsten Stellen deklariert.

Ist eine sehr unsaubere Art und Weise. Wenn Du die Variable global 
deklarieren möchtest, deklariere sie wenigstens in der C-Datei.

von qwertz (Gast)


Lesenswert?

Okay - coole Sache. Jetzt klappt es.

Warum eigentlich:
global.h
extern int skt;

?

von der mechatroniker (Gast)


Lesenswert?

> und folglich wird die Variable an
> unterschiedlichsten Stellen deklariert.

Du meinst definiert. Das Gegenteil wäre ja nicht schlimm, solange die 
Deklarationen übereinstimmen bzgl. Datentyp etc.

> Ist eine sehr unsaubere Art und Weise. Wenn Du die Variable global
> deklarieren möchtest, deklariere sie wenigstens in der C-Datei.

Er sollte sie in der C-Datei definieren. Deklariert gehört sie 
tatsächlich im Header.

von Karl H. (kbuchegg)


Lesenswert?

qwertz schrieb:
> Okay - coole Sache. Jetzt klappt es.
>
> Warum eigentlich:
> global.h
> extern int skt;
>
> ?

Weil das so definiert ist.
Es wird unterschieden zwischen Definition und Deklaration.

Eine Definition ist etwas, bei dem tatsächlich Speicher angelegt wird. 
Eine Deklaration ist etwas, mit dem man dem COmpiler zur gefälligen 
Kenntnisnahme mitteilt, dass etwas irgendwo existieren würde.

Was soll denn COmpiler/Linker machen, wenn du schreibst
main.c
1
int socket = 5;

anders.c
1
int socket = 8;

was gilt denn nun? Ist die Intialisierung 5 oder 8?

Daher: In einem komplettren Programm gibt es nur EINE Definition. Zb die 
hier
anders.c
1
int socket = 8;
aber es kann beliebig viele Deklarationen geben, mit denen man sich auf 
diese EINE Defintion beziehen kann.
main.c
1
extern int socket;

Das 'extern' sagt im Grunde nur: Iregendwo anders gibt es eine Variable 
namens 'socket'. Irgendwo, aber nicht hier. Diese Variable ist vom Typ 
'int' und wenn ich 'socket' verwende, dann meine ich genau diese 
Variable, die in irgendeiner anderen Übersetzungseinheit steckt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.