Header-Dateien in C

#1151499
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
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
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
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).
Gast #1151541
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.