mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Header-Dateien in C


Autor: Gast_1 (Gast)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Gast_1 (Gast)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: Gast_1 (Gast)
Datum:

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

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.