Forum: Compiler & IDEs Headerdatei und C Datei: includes


von Frank K. (Gast)


Lesenswert?

Hallo,
was ist richtig:

xxx.c:
1
#include "xxx.h"

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

oder:

xxx.c:
1
#include "xxx.h"
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
#include <inttypes.h>

xxx.h:
1
void func(void);

von Gast (Gast)


Lesenswert?

beides geht
variante 1 gefällt mir generell besser

von zwieblum (Gast)


Lesenswert?

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

von zwieblum (Gast)


Lesenswert?

oops sorry, hab' mich verlesen ;-)

von Frank K. (Gast)


Lesenswert?

Ok danke ich nutze bereits Variante 1. Finde ich auch übersichtlicher.

von Frank K. (Gast)


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?

von EtaBetaPi (Gast)


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.

von Frank K. (Gast)


Lesenswert?

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

von STK500-Besitzer (Gast)


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.

von Karl H. (kbuchegg)


Lesenswert?

Oder Variante 3:

xxx.c:
1
//zuerst Systemheader
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
#include <inttypes.h>
5
6
//dann eigene Header
7
#include "xxx.h"
8
9
void func( void )
10
{
11
  ...
12
}
13
14
...

xxx.h:
1
#ifndef XXX_H_INCLUDED
2
#define XXX_H_INCLUDED
3
4
void func(void);
5
6
#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
1
#include "xxx.h"
2
3
int main()
4
{
5
  foo();
6
}

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.

von Frank K. (Gast)


Lesenswert?

Und wie mache ich es, wenn ich z.B.

#include <inttypes.h>

in der c und h Datei brauche?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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  ;-)

von Frank K. (Gast)


Lesenswert?

also dann doch lieber die Library Header direkt im C File includen.

von EtaBetaPi (Gast)


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:
1
#include <inttypes.h>
2
3
void func(uint8_t);

xyz.c:
1
//zuerst Systemheader
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
5
//dann eigene Header
6
#include "xyz.h"
7
8
9
void func(uint8_t x)
10
{
11
12
13
}

von Frank K. (Gast)


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

von EtaBetaPi (Gast)


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:
1
#ifndef XYZ_H_
2
#define XYZ_H_
3
4
void func(void)
5
#endif

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.