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



  • s. Include-Guard

    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 aber

    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 S

    typedef 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



    1. Der include guard umfässt normalerweise den kompletten header.
    2. Wie schon gesagt jeder header sollte sich selber drum kümmern
    3. 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,


  • Mod

    @JamesNguyen sagte in C - include in mehreren Header-Dateien:

    ok,
    das habe ich glaub ich verstanden aber

    Hast 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 S

    typedef 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.c

    2.h
    2.c

    3.h
    3.c

    und 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


Anmelden zum Antworten