C - include in mehreren Header-Dateien



  • 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


Log in to reply