Schlüsselwort "extern"

Gast #411637
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.
Gast #411640
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)
Persönliche Seite #411642
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).
Gast #411644
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.
Moderator Persönliche Seite #411645
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.
Persönliche Seite #411646
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.