mikrocontroller.net

Forum: Compiler & IDEs Headerdatei und C Datei: includes


Autor: Frank K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
was ist richtig:

xxx.c:
#include "xxx.h"

xxx.h:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>
void func(void);

oder:

xxx.c:
#include "xxx.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>

xxx.h:
void func(void);

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
beides geht
variante 1 gefällt mir generell besser

Autor: zwieblum (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
probier's aus. je nach einstellungen wird dein compiler bei v2 schreine 
:-)

Autor: zwieblum (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oops sorry, hab' mich verlesen ;-)

Autor: Frank K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok danke ich nutze bereits Variante 1. Finde ich auch übersichtlicher.

Autor: Frank K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe in einer Headerdatei eine enum deklariert. Diese ist allerdings 
2 mal per include eingebunden, und jetzt hagelts redeclaration Fehler. 
Wie kann ich so was vermeiden?

Autor: EtaBetaPi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Indem du folgendes an den anfang und ende deiner header datei schreibst:

#ifndef FILE_H_
#define FILE_H_

# Deine Sachen


#endif

Damit verhinderst du mehrfaches inkludieren desselben headers.

FILE_H_ ist im Prinzip beliebig, muss aber fuer jede header datei 
unterschiedlich sein.

Autor: Frank K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm danke nur jetzt kommt immer noch was von multiple definition in ner 
interrupt routine.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>hmm danke nur jetzt kommt immer noch was von multiple definition in ner
>interrupt routine.

Haben die WinAVR-Header-Dateien nicht auch entsprechende Möglichkeiten 
der Abfrage, ob sie schin eingefügt wurden?
Das muss man halt in sämtlichen Dateien konsequent machen.

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

Bewertung
0 lesenswert
nicht lesenswert
Oder Variante 3:

xxx.c:
//zuerst Systemheader
#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>

//dann eigene Header
#include "xxx.h"

void func( void )
{
  ...
}

...

xxx.h:
#ifndef XXX_H_INCLUDED
#define XXX_H_INCLUDED

void func(void);

#endif

Generell: In einem Header File sollten nur die Includes rein, die für 
dieses Header File notwendig sind. Nicht mehr.
Machst du dort einen Rundumschlag, dann drängst du dem Verwender dieses 
Include Files zusätzliche #include auf, die der vielleicht gar nicht 
haben will.

Beispiel:
Wenn ich dein xxx.h verwende
#include "xxx.h"

int main()
{
  foo();
}

dann kriege ich alleine durch den #include "xxx.h" den Header 
interrupt.h mit hinein, den ich weder benötige noch dort haben will.

Wenn jedes File, *.c oder *.h, immer nur die #include macht, die es 
tatsächlich braucht, hast du kürzest mögliche Compilezeit und auch die 
Wartung wird einfacher, weil es keine Überraschungen gibt.

Autor: Frank K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wie mache ich es, wenn ich z.B.

#include <inttypes.h>

in der c und h Datei brauche?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank K. schrieb:
> Und wie mache ich es, wenn ich z.B.
> #include <inttypes.h>
> in der c und h Datei brauche?
Dann bindest du diesen Header als erstes im c-File ein  ;-)

Autor: Frank K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also dann doch lieber die Library Header direkt im C File includen.

Autor: EtaBetaPi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Normalerweise bindest du den Header sowieso in die zugehörige C-Datei 
ein, damit die Deklarationen im Header bzw. die Definitionen in der 
C-Datei vom Compiler geprüft werden können.

Dann reicht es im Header zu inkludieren.

Beispiel xyz.c und xyz.h brauchen #include <inttypes.h>:

xyz.h:
#include <inttypes.h>

void func(uint8_t);

xyz.c:
//zuerst Systemheader
#include <avr/io.h>
#include <avr/interrupt.h>

//dann eigene Header
#include "xyz.h"


void func(uint8_t x)
{


}

Autor: Frank K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok also alles was in c und h gebraucht wird in den Header includen.

Und wo ist jetzt der Unterschied zwischen:
#ifndef FILE_H_
#define FILE_H_

und

#ifndef XXX_H_INCLUDED
#define XXX_H_INCLUDED

Autor: EtaBetaPi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Garkeiner, die Funktion ist die selbe. FILE_H_ und XXX_H_INCLUDED sind 
lediglich Präprozessor-Symbole, auf deren Nicht-Existenz mit #ifndef 
geprüft wird. Ist das Symbol nicht definiert, wird es mit #define 
definiert und alles bis zum #endif in die aufrufende Datei inkludiert.

Damit ist das Symbol in der aufrufenden Datei deklariert und der 
inkludierte Header kann in derserlben datei nicht nocheinmal inkludiert 
werden (dein ursprüngliches problem).

Du kannst diesen Symbolen im Prinzip beliebige Namen geben. Nur muss in 
jeder Header-Datei ein anderer Name verwendet werden (vgl. obige 
Ausführung). Üblicherweise konstruiert man daher den Namen aus dem 
Dateinamen des Headers unter benutzung der erlaubten Zeichen. Du musst 
darauf Achten, dass der Name möglichst einzigartig ist, da er sonst mit 
in anderen Headern definierten Symbolen oder Makros in Konflikt graten 
kann.

Beispiel:

xyz.h:
#ifndef XYZ_H_
#define XYZ_H_

void func(void)
#endif

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.