Forum: Mikrocontroller und Digitale Elektronik Header-Dateien in C


von Gast_1 (Gast)


Lesenswert?

Hallo,
ich schreibe gerade eine eigene Header-Datei in C:
Müssen dabei die Funktionsprototypen mit ´extern´ deklariert werden oder 
nicht oder ist das egal.
Ich habe das mal so und mal so gesehen.

Vielen Dank Gast_1

von Johannes M. (johnny-m)


Lesenswert?

Gast_1 wrote:
> Müssen dabei die Funktionsprototypen mit ´extern´ deklariert werden oder
> nicht oder ist das egal.
Nein, sie müssen nicht. Und wenn man sich vor Augen führt, was das 
extern überhaupt für eine Funktion hat, dann wird das auch klarer. 
extern dient eigentlich nur dazu, dass der Compiler weiß, dass es sich 
um eine Deklaration handelt und nicht um eine Definition. 
Deklarieren darf man ein Objekt schließlich beliebig oft, während es 
genau einmal definiert werden muss.

Bei Funktionen kann der Compiler aber schon aus der Syntax ableiten, ob 
es Definition oder Deklaration ist (wenn der Funktionskörper fehlt, ist 
es eine Deklaration, also ein Prototyp). Bei Variablen kann er das 
nicht, weshalb da das extern erforderlich ist.

> Ich habe das mal so und mal so gesehen.
Man kann es machen, es bringt aber nichts.

von Gast_1 (Gast)


Lesenswert?

Hallo Johannes,
danke für die schnelle Antwort.
In meinem "schlauen" C-Buch steht nämlich:

"extern ... geht einem Funktionsprototypen voraus, wenn sich die 
Funktionsdefinition in einer anderen Datei befindet".

Und das ist doch eigentlich hier der Fall, denn die Funktionsdefinition 
befindet sich ja in der anderen *.c-Datei und nicht in meiner 
eigentlichen (Haupt)Programm-Datei.

Aber meinem Compiler scheint es auch egal zu sein.

Danke

Gast_1

von Johannes M. (johnny-m)


Lesenswert?

Gast_1 wrote:
> "extern ... geht einem Funktionsprototypen voraus, wenn sich die
> Funktionsdefinition in einer anderen Datei befindet".
Wie gesagt, man kann es machen, vielleicht, um explizit zu 
kennzeichnen, dass eine Funktion in einer anderen Datei definiert ist. 
Allerdings sollte man sowieso zu jeder Quelldatei, die Objekte enthält, 
die von anderen Projektteilen verwendet werden können sollen, eine 
Headerdatei mit allen relevanten Deklarationen schreiben. Und in eine 
Headerdatei gehören nunmal nur Deklarationen und keine Definitionen. 
Dass die Definition sich in einer anderen Datei befindet, ist in dem 
Fall also selbstredend und muss nicht extra erwähnt werden...

> Aber meinem Compiler scheint es auch egal zu sein.
Das hat ihm auch egal zu sein.

von Klaus W. (mfgkw)


Lesenswert?

Deklarationen von Funktionen (also: int f();) werden immer als extern 
betrachtet, deshalb ist es hier egal, ob man es dazu schreibt oder 
nicht.

Einen Unterschied macht es nur bei globalen Variablen: hier ist es ohne 
extern eine Definition (int i;), mit eine Deklaration (extern int i;).

Eine spätere Definition der Funktion oder Variable (dann ohne extern) 
hebt das eventuelle vorherige extern einfach stillschweigend auf.
Deshalb ist es unkritisch, in einer Headerdatei etwas mit extern zu 
deklarieren und in einem Quelltext nach dem #include die Definition 
nachzuholen (natürlich nur in einem Quelltext).

von Gast_1 (Gast)


Lesenswert?

Schönen Dank für die Antworten.
Wie gesagt: in meinen C-Büchern hörte sich die Verwendung von ´extern´ 
"ZWINGEND" an.
Nun weiß ich Bescheid.

Danke

Gast_1

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.