mikrocontroller.net

Forum: Compiler & IDEs Schlüsselwort "extern"


Autor: thorstendb (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>wer weiss genaueres über das Schlüsselwort "extern" ?

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

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wer sind Brian und Dennis?

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: muuh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Brian W. Kernighan, Dennis M. Ritchie glaube die haben C verbrochen ...

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: thorstendb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>brechreizerregend schlecht

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

Trotzdem werde ich mir doch noch eine aktuelle Ausgabe besorgen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.