www.mikrocontroller.net

Forum: PC-Programmierung Header-Datei was gehört alles rein?


Autor: Lings (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

was kommt alles in eine Header-Datei rein?

Programmiersprache: C


Macht es Sinn in eine Header-Datei nur das Prototyp zu schreiben?
Ich wäre für Links auf gute Websites auch sehr dankbar..

Dankeschön


ps. habe schon gegooglet aber nicht entdeckt, sowohl auch hier zu erst 
die Suche benutzt

Autor: Dida N. (quader)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mögliche Defins sind in der Header auch gut aufgehoben...

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Header-Files enthalten normalerweise alle Funktionsprototypen, 
Deklarationen von globalen Variablen swoie Typ-/Klassendefintionen (C++) 
einer (i.d.R.) gleichnahmigen C-Datei.

Programmcode (außer inline) und Variablendefinitionen haben in H-Files 
nix verloren.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lings wrote:
> Hallo,
>
> was kommt alles in eine Header-Datei rein?

Auf einen kurzen Nenner:
In einem Header File ist alles enthalten, was ein
Verwender der in diesem Modul (Header File + zugehörige
Implementierung) zur Verfügung gestellten Funktionalität
benötigt um diese Funktionalität auch tatsächlich nutzen
zu können.

Das Header File fungiert als 'Interface' zu dieser
Funktionalität.

Wénn deine Funktionalität darin besteht, dass Funktionen
zur Verfügung gestellt werden, dann gehören die Prototypen
der extern sichtbaren Funktionen in das Header File.

Wenn deine Funktionalität bedingt, dass der Verwender
Kenntnis über bestimmte Datenstrukturen braucht, sei es
weil er diese Strukturen befüllen muss oder weil die
Strukturen Teil der Argumentliste von Funktionen ist, dann
gehören diese Strukturdefinitionen ins Header File.

Wenn deine Funktionalität beinhaltet, dass es benannte 'Konstanten',
also C-Makros gibt, die der Verwender deiner Funktionalität kennen
muss (zb. weil es sich dabei um Steuerwerte handelt, mit denen
Funktionen gesteuert werden) dann gehören diese ins Header File.

Wenn deine Funktionalität bedeutet, dass ...... gibt ...... und
dein Verwender dies wissen muss, .... dann gehört ..... ins Header
File.

Alles andere gehört ins C File, in dem auch die Funktionalität
implementiert ist.

Autor: Lings (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dann folgt daraus, dass ich ein Header-Datei erstellen muss, auch wenn 
es nur das Prototyp der Funktion enthält :-D

Danke für die Antworten

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lings wrote:
> dann folgt daraus, dass ich ein Header-Datei erstellen muss, auch wenn
> es nur das Prototyp der Funktion enthält :-D

Muss, im Sinne von 'anderfalls geht die Welt unter' ist übertrieben.
Aber sinnvoll ist es immer.

Nichts und niemand hindert dich daran, sowas hochzuziehen:

File: A.c
*********
int foo( void )
{
  return 0;
}

File: B.c
*********
int foo( void );

int main()
{
  int j = foo();
}

Wenn man es genau nimmt, und man ein bischen zocken möchte :-),
kann man sich sogar den Protoypen sparen. Aber das ist dann
in der Realität schon ein Grund dem Programmierer eine in die
Fr... zu hauen.

B.C verwendet eine Funktionalität, die in A.C implementiert ist,
die Funktion foo(). In diesem Beispiel hat sich B.C selbst darum
gekümmert, dass dem Compiler das externe Interface von A.C,
nämlich der Prototyp der Funktion, bekanntgemacht wird.
Aber: Eigentlich ist das nicht die Aufgabe von B.C
Eigentlich ist es die Aufgabe von A.C dem Verwender, nämlich B.C
diese Information zur Verfügung zu stellen. Denn nur A.C kann
letztendlich wissen, ob das so korrekt ist.
Es hindert dich nämlich auch nichts und niemand daran, das hier
zu tun ...

File: B.c
*********
double foo( int );

int main()
{
  int j = foo( 8 );
}

... also falsche Angaben in B.C über die von A.C bereitgestellte
Funktion zu machen.
Das es in diesem Programm krachen wird, dürfte klar sein.

Die Lösung dazu lautet: Header File

File: A.c
*********
#include "A.h"

int foo( void )
{
  return 0;
}

File: A.h
*********
#ifndef A_H_INCLUDED
#define A_H_INCLUDED

int foo( void );

#endif

File: B.c
*********
#include "A.h"

int main()
{
  int j = foo();
}

Wenn du da jetzt denselben Fehler einbaust ....

File: A.h
*********
#ifndef A_H_INCLUDED
#define A_H_INCLUDED

double foo( int );

#endif

.... dann klopft dir der Compiler auf die Finger weil er beim
Compilieren von A.c bemerkt, dass der Protoyp nicht mit der
tatsächlichen Funktionsdefinition übereinstimmt (A.c includiert
ja ebenfalls A.h).

dass

Autor: Lings (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das ist natürlich ein sehr guter Grund, warum man Header-File benutzen 
sollte :-)

Danke  Karl heinz Buchegger

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hätte dazu auch mal eine Frage: Ich habe eine C-Funktion, welche mir 
die Uhrzeit auf meinem Display ausgibt. Die Uhrzeit ist in einem struct 
enthalten. Dieses struct gehört ja eigentlich nicht zum Display und 
dessen Funktionen, sondern ist natürlich in einem anderen Header-File 
definiert.

Nach den oben stehenden Aussagen sollte das Einbinden der entsprechenden 
Header-Datei, in dem das struct definiert ist, in der Header-Datei zum 
Display gemacht werden, und nicht separat im C-File, welches die Uhrzeit 
auf dem Display ausgibt. Habe ich das so richtig verstanden?

Also anstatt:
//Inhalt LCD_PUTCLK.C
#include "TIME.H"
#include "LCD.H"
...
lieber:
//Inhalt LCD.H
#include "TIME.H"
...

Ralf

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.