Forum: Compiler & IDEs Schlüsselwort "extern"


von thorstendb (Gast)


Lesenswert?

Moin zusammen,

wer weiss genaueres über das Schlüsselwort "extern" ?

Wenn ich eine main.c, main.h, lcd.c und lcd.h habe, und von der main.c
auf Funktionen der lcd.c zugreife, #include ich ja die "lcd.h" in der
main.

Müssen jetzt die Funktionen, die ich aus der lcd.c exortieren will in
andere C-files (main.c) als
extern void lcd_print(...);
deklariert werden oder nicht ?

Teilweise hatte ich bei Compilern Probs, wenns nciht extern war, dann
gings wieder ohne ...
...und im Netz finde ich da auch keine Antwort drauf.

Die Frage ist, was macht der Compiler aus den Deklarationen mit extern
aus dem header, die im zugehörigen c-file definiert (also
ausprogrammiert) sind ?


Greetz,
/th.

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>wer weiss genaueres über das Schlüsselwort "extern" ?

Brian und Dennis habe darüber was in ihrem Buch geschrieben...

von Christian (Gast)


Lesenswert?

wer sind Brian und Dennis?

von johnny.m (Gast)


Lesenswert?

Brian W. Kernighan und Dennis M. Ritchie: The C Programming Language
(dt.: Die Programmiersprache C), das Standard-Werk von den Erfindern
von C... Prädikat: Empfehlenswert (zumindest in der englischen
Originalfassung, die deutsche Übersetzung soll angeblich nicht sooo
toll sein)

von muuh (Gast)


Lesenswert?

Brian W. Kernighan, Dennis M. Ritchie glaube die haben C verbrochen ...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das Schlüsselwort "extern" ist bei Funktionsdeklarationen (Prototypen)
implizit. Wird nicht explizit "static" angegeben, so sind sie
automatisch "extern".

Es ist daher unnötig, bei Funktionsdeklarationen dieses Schlüsselwort
zu verwenden.

"static" zusammen mit Funktionsdeklarationen in einer Headerdatei zu
verwenden, ist wiederum widersinnig, da "static" die Sichtbarkeit der
Deklaration auf das aktuelle Modul beschränkt (also kein Linkersymbol
erzeugt), daher können und sollten solche Funktionsprototypen im
C-Source-File deklariert werden.


Das sieht bei Variablendeklarationen anders aus; hier kann nur durch
Verwendung des Schlüsselwortes "extern" überhaupt zwischen
Deklaration und Definition unterschieden werden.

Variablendeklarationen in Headerdateien sollten daher immer mit
"extern" geschrieben werden, weil sonst für jedes Einbinden der
Headerdatei eine neue Instanz der Variablen definiert wird, was der
Linker mit entsprechenden Fehlermeldungen würdigt (das kann gcc auf
Wunsch anders handhaben, das halte ich allerdings für ausgemachten
Murks).

von thorstendb (Gast)


Lesenswert?

Hi,

ich meine nämlich dass sich der WinAVR beschwert hat, wenn ich nciht
explizit extern davorgeschrieben hab im header...

von johnny.m (Gast)


Lesenswert?

Prinzipiell (kurz gefasst) besagt "extern" bei einer
Variablendeklaration, dass diese Variable (im Unterschied zu
automatischen und static-Variablen) auch außerhalb der Quelldatei, in
der sie deklariert ist, sichtbar sein soll.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Es ist daher unnötig, bei Funktionsdeklarationen dieses
> Schlüsselwort zu verwenden.

Aber es stört auch überhaupt nicht, wenn man es davor schreibt.
Mit "extern" hat man halt immer eine Deklaration erzwungen, es
kann nie eine Definition werden.  Ohne "extern" bleibt es bei
Funktionen immer noch nur eine Deklaration, während es bei
Variablen dann zur Definition wird (d. h. an dieser Stelle
wird der Compiler auch den Speicherplatz einräumen).

> Prinzipiell (kurz gefasst) besagt "extern" bei einer
> Variablendeklaration, dass diese Variable (im Unterschied zu
> automatischen und static-Variablen) auch außerhalb der Quelldatei,
> in der sie deklariert ist, sichtbar sein soll.

Nein, das wäre sie auch ohne "extern", sofern sie nicht "static"
deklariert oder definiert ist.  Mit "extern" macht man lediglich dem
Compiler eine Funktion oder Variable bekannt, die in einem anderen
Übersetzungsmodul global bereitgestellt worden ist.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das angesprochene Buch heißt "Programmieren in C" und ist im Hanser
Verlag erschienen.
Die zweite Auflage (1990) ist auch in der deutschen Übersetzung
brauchbar und beschreibt ANSI-C/C89.
Die erste Auflage ist hingegen brechreizerregend schlecht übersetzt und
beschreibt auch nur das veraltete "K&R"-C, das keine
Funktionsprototypen und kaum Typüberprüfung kannte - Finger weg, auch
wenn's antiquarisch günstig sein sollte.

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>brechreizerregend schlecht

Nö, finde ich nicht. Ich finde die Version sehr amüsant...

Trotzdem werde ich mir doch noch eine aktuelle Ausgabe besorgen.

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.