C-Lib mit Namespace



  • Also soweit ich sah, kann man C und C++ Codes mit GCC Objekt-Dateien kompilieren und dann zusammenlinken.

    Mich interessiert es, ob man eine fertige C-Library die man irgendwo bekommt, in einen separaten namespace ausgliedern kann? Ohne, dass man gleich alle Codes ändern muß.

    Reicht es z.B. headeriles zu ändern? Oder muß ich dann doch Codes nach C++ konvertieren und alles sauber mit namespace machen?



  • Also wenn du denkst was ich denke dass du das denkst, dann denke ich meinst du das hier?

    //C-Header
    #include<stdio.h>
    //Das ganze in C++
    #include<cstdio>
    using namespace std;
    //anstatt jedesmal vor cout ein std:: zu hängen
    


  • Wenn du eine C-Bibliothek ohne Namespace hast, und einfach die .cpp und .h -Dateien deinem Projekt hinzufügst, wirst du mit großer Sicherheit alles in einen Namesoace packen können.
    Allerdings muss dann der Code in den .h und .cpp -Paare immer in den gleichen Namespace gepackt werden, dann hast du am wenigsten Arbeit damit.

    Beispiel:

    bla.h:

    ...include
    void bla_foo(int, int);
    ...
    

    bla.cpp:

    #include "bla.h"
    
    void bla_foo(int a, int b)
    {
        tu_dies();
    }
    

    In Namespace bla packen:

    bla.h:

    ...include
    namespace bla
    {
        void bla_foo(int, int);
        ...
    }
    

    bla.cpp:

    #include "bla.h"
    namespace bla
    {
         void bla_foo(int a, int b)
         {
             tu_dies();
         }
    }
    


  • Naja, C++ ist nicht 100% zu C "abwärtskompatibel". D.h. man muss u.U. einiges ändern, je nachdem wie die C Library geschrieben ist, um den Code als C++ compilieren zu können.

    Eine Alternative (wenn es nur um Namenskollisionen geht) wäre evtl. allen Funktionen/Typedefs/Structs/Globalen einen Prefix zu verpassen (also "foo" in "xyzlibrary_foo" umnennen und so weiter).



  • hm ich hab gehofft das ginge einfacher

    wäre es den möglich eine lib so zu nehmen wie die ist und diese dazulinken. Jedoch die header würde ich mit namespaces ergänzen. Aber ich denke dann gäbe es compiler-errors, oder???

    namespace blub
    {

    extern "C"
    {
    void foo();
    };

    };

    würde das gehen? oder sind extern "C" und namespace inkompatibel?



  • Cool ich hab nun einen kleinen test gemacht

    hab ein DLL-Projekt erstellt und das kompiliert:

    #include "stdio.h"
    #define DECL __declspec(dllexport)
    
    DECL void test()
    {
        printf("Es geht");
    }
    

    dann hab ich ein C++ Projekt erstellt:

    #define DECL __declspec(dllimport)
    
    namespace blub
    {
    
        extern "C"
        {
            DECL void test();
        };
    
    };
    
    int main()
    {
        blub::test();
        return 0;
    }
    

    Der Code wird ohne Fehler kompiliert und ausgeführt... Ohne extern "C" geht es übrigens nicht...


Anmelden zum Antworten