Header-Dateien in C

#1151499
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.
Gast #1151507
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
#1151522
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.
#1151530
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).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren