gleichnamige Header inkludieren



  • Hi Leute,

    Ich schreibe an einem kleinen Programm und nutze dazu verschiedene Sourcecode-Quellen. Nun tritt der Fall auf, dass einige Dateien (allerdings in unterschiedlichen Verzeichnissen) die gleichen Headernamen haben und den gleichen Include guard verwenden. Gibt es die Möglichkeit beide Dateien zu inkludieren, ohne diese umbenennen zu müssen?

    ...sowas wie einen Namensraum für Includes? ...gibt es sowas?

    viele Grüße,
    SBond



  • Wenn sie in unterschiedlichen Verzeichnissen sind, gibt es doch kein Problem.

    #include "folder1/header.h"
    #include "folder2/header.h"
    

    Edit: hab das mit dem include guard überlesen, wo ist das Problem die header einfach umzubenennen?



  • Ich nutze unter anderem einen ANS1-Compiler, der bei meinen ANS1-Modulen ca. 150 .h und .c Dateien generiert. In diesem Fall müsste ich jede Datei per Hand editieren. Des Weiteren inkludieren viele dieser Header weitere Header mittels #include <...>. Ggf müsste ich diese Dateien auch mal neu generieren, wenn es Änderungen an den Modulen gibt.

    So könnte man sich die Ordnerstruktur vorstellen:

    MeinProjekt\Lib1\...
    MeinProjekt\Lib2\...
    MeinProjekt\*.*
    

    ...und zwischen Lib1 und Lib2 gibt es Header mit gleichem Namen und gleichen include guard 😞



  • Wenn es keine verschachtelten mehrfach-includes gibt (was aber vermutlich doch der Fall ist) könnte es so gehen:

    #include <ordner1/header.h>
    #undef _HEADER_H_
    #include <ordner2/header.h>

    Ansonsten mit etwas Perl oder anderer Magie die Dateien automatisiert editieren?



  • Habe es jetzt erstmal durch manuelles Anpassen der betroffenen Dateien gelöst. Allerdings wäre es schon interessant, wie man solch ein Problem bei größeren Softwareprojekten löst.

    Insbesondere wenn man mehrere exterene Quellen verwendet wie Boost, OpenSSL, ASN1c, NTP, ... Da hier in der Regel einfach die Pfade zum Projekt hinzugefügt werden, entsteht die Gefahr der doppelten Headernamen (und doppelten Include guard)



  • SBond schrieb:

    Allerdings wäre es schon interessant, wie man solch ein Problem bei größeren Softwareprojekten löst.

    #pragma once?


  • Mod

    SBond schrieb:

    Allerdings wäre es schon interessant, wie man solch ein Problem bei größeren Softwareprojekten löst.

    Längere Bezeichner. Oft wird die Konvention

    PROJEKT_PFAD_DATEI
    

    oder gar

    PROJEKT_PFAD_DATEI_INCLUDED
    

    benutzt. Es soll auch Leute geben, die GUIDs benutzen, was meiner Meinung aber eher zeigt, dass man es auch übertreiben kann.



  • SeppJ schrieb:

    Es soll auch Leute geben, die GUIDs benutzen, was meiner Meinung aber eher zeigt, dass man es auch übertreiben kann.

    *meld* Mach ich auch mal, wenn kein eindeutiger Projektname gegeben ist.

    SBond schrieb:

    Da hier in der Regel einfach die Pfade zum Projekt hinzugefügt werden, entsteht die Gefahr der doppelten Headernamen

    Jupp, hier auch. Fünf Fremdlibs (Header und *.lib bzw *.so) benutzen ICU, drei benutzen libiconv, jeweils in unterschiedlichen Versionen. Eine mögliche Pfadreihenfolge wurde durch langes Rumprobieren gefunden; einzelne Dateien müssen trotzdem eine anderere Reihenfolge benutzen.


Log in to reply