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.
>wer weiss genaueres über das Schlüsselwort "extern" ?
Brian und Dennis habe darüber was in ihrem Buch geschrieben...
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)
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).
Hi, ich meine nämlich dass sich der WinAVR beschwert hat, wenn ich nciht explizit extern davorgeschrieben hab im header...
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.
> 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.
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.
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.