C - include in mehreren Header-Dateien
-
Hallo,
kurze Frage,
macht es was wenn ich ,
mehrere Header includiere in denen jeweils bspw. immer include <stdio.h> verwendet wird?
falls ja ist es dann sinnvoll include guards dafür in jedem header verwenden?
Danke,
James
-
@JamesNguyen stdio.h hat selber Include Guards,
Jeder Header sollte die für sich haben.
Es gibt aber auch Compileroptionen dafür.
-
ah ok
wenn ich jetzt include guards für stdio manuell machen wollte wie sieht das dann aus?
ich kenne ja
#ifndef
#def ...#endif
wenn man was definieren will bspw. einen datentyp
gibt für include
dann sowas wie
#ifninclude?
#include ...oder
ist das genauso
#ifndef
#include <stdio.h>#endif?
Danke
-
Nur jeder Header selbst benötigt einen Include-Guard, beim Einbinden mittels
#include
wird dann keiner mehr benötigt.
Und alle Standard-Header haben einen eigenen Include-Guard.
-
ok,
das habe ich glaub ich verstanden aberwas ist wenn ich zwei an sich verschiedene Header habe
die ich includieren möchte.aber in beiden definiere ich
bspw. den
typedef short s ;
da habe ich in beiden Headern dann
#ifndef S
#def Stypedef short s ;
#endif
gemacht. Er inkludiert also beide Headerdateien (beide haben jeweils include guards um ihr ganzes rum und dann nochmal
extra für den short s )Meine Frage ist ob ich dieses Vorgehen auch für
include <stdio.h>
machen muss
wenn
include <stdio.h> in beiden Headern drin ist und ich beide Headerdateien inkludieren möchte.
Danke
-
- Der include guard umfässt normalerweise den kompletten header.
- Wie schon gesagt jeder header sollte sich selber drum kümmern
- Wenn dein compiler
#pragma once
unterstützt, dann würde ich das vorziehen vor den normalen guards.
-
@JamesNguyen sagte in C - include in mehreren Header-Dateien:
Meine Frage ist ob ich dieses Vorgehen auch für
include <stdio.h>
machen muss
wenn
include <stdio.h> in beiden Headern drin ist und ich beide Headerdateien inkludieren möchte.Nein, denn stdio.h ist ein Standardheader.
@Th69 sagte in C - include in mehreren Header-Dateien:
Und alle Standard-Header haben einen eigenen Include-Guard.
und
@DirkB sagte in C - include in mehreren Header-Dateien:stdio.h hat selber Include Guards,
-
@JamesNguyen sagte in C - include in mehreren Header-Dateien:
ok,
das habe ich glaub ich verstanden aberHast du nicht.
was ist wenn ich zwei an sich verschiedene Header habe
die ich includieren möchte.aber in beiden definiere ich
bspw. den
typedef short s ;
da habe ich in beiden Headern dann
#ifndef S
#def Stypedef short s ;
#endif
gemacht. Er inkludiert also beide Headerdateien (beide haben jeweils include guards um ihr ganzes rum und dann nochmal
extra für den short s )Das funktioniert, aber tu das niemals! Niemals! Du verdeckst Fehler im Aufbau deiner Module. Denn die doppelte Definition von
s
ist schlicht falsch.Meine Frage ist ob ich dieses Vorgehen auch für
include <stdio.h>
machen muss
wenn
include <stdio.h> in beiden Headern drin ist und ich beide Headerdateien inkludieren möchte.
Nein. Das ist doch gerade der Sinn der Includeguards, die in stdio.h schon drin sind.
Benutz Includeguards so und nur so wie vorgesehen. Also das ifndef/def in den ersten beiden Zeilen eines selbsgeschriebenen Headers und ein
#endif
in der letzten Zeile. Wenn du denkst, dass du irgendwelche kreativen anderen Anwendungsfälle brauchst, dann machst irgendetwas anderes falsch.
-
Ok
angenommen ich schreibe 3 Sachen:
1.h
1.c2.h
2.c3.h
3.cund includiere am Ende
in 3.h - 1.h und 2.h
In 1.c und 2.c
möchte ich den jeweils den typdef short s
benutzen. Deshalb mach ich den in 1.h und 2.h rein weil die inkludieren sich nicht habe also keine Verbindung zueinander.Macht es jetzt Probleme wenn ich wie oben gesagt 1.h und 2.h in 3.h inkludiere (er würde ja dann zweimal den typedef
definieren.
-
@JamesNguyen sagte in C - include in mehreren Header-Dateien:
In 1.c und 2.c
möchte ich den jeweils den typdef short s
benutzen. Deshalb mach ich den in 1.h und 2.h rein weil die inkludieren sich nicht habe also keine Verbindung zueinander.Mach ein 0.h wo du den typedef rein packst.
Und dann inkludierst du überall wo du den typedef brauchst halt 0.h
-
Ist es eig konzeptionell richtiger 1.h und 2.h in 3.c zu inkludieren oder in 3.h?
-
@JamesNguyen sagte in C - include in mehreren Header-Dateien:
Ist es eig konzeptionell richtiger 1.h und 2.h in 3.c zu inkludieren oder in 3.h?
Inkludier es dort wo du es brauchst.
Wenn du in 3.h etwas aus 1.h brauchst, dann muss 3.h natürlich 1.h inkludieren.Grundsätzlich gilt: jedes header file sollte für sich alleine verwendet werden können.
Also wenn ich x.c habe, und darin als 1. Zeile schreibe
#include "y.h"
dann muss das funktionieren. Wenn es nicht funktioniert, dann ist y.h fehlerhaft.
-
@JamesNguyen sagte in C - include in mehreren Header-Dateien:
Ist es eig konzeptionell richtiger 1.h und 2.h in 3.c zu inkludieren oder in 3.h?
Ja.
Wenn du in einem Header (a.h) Informationen aus einem anderen Header (b.h) brauchst, inkludierst du ihn.
Wenn in einem C-Code (d.c) unabhängig von a.h Informationen aus b.h brauchst, inkludierst du b.h nochmal in d.c