Ausimplementieren im Header



  • bei vc gibts auch #pragma once



  • Include Guards bringen doch auch nichts,
    da ich die Implementierung ja immernoch mehrfach beim Linken habe...

    Ich hab jedenfalls nen Include Guard drum...



  • Cpp-Anfänger (off) schrieb:

    Include Guards bringen doch auch nichts,
    da ich die Implementierung ja immernoch mehrfach beim Linken habe...

    Ich hab jedenfalls nen Include Guard drum...

    Jede Übersetzungseinheit sieht den Code nur einmal, das sollte also passen.

    MfG SideWinder



  • Vielen Dank für eure Unterstüzung allerdings bringt bei mir der Include Guard gar nix...

    Hier mal der vereinfachte Code:

    myheader.h:

    #ifndef _MYHEADER_H_
    #define _MYHEADER_H_
    
    /* inline */ void myfunc(){ // hier das inline und es funkt
    }
    
    #endif
    

    myclass.h:

    #include "myheader.h"
    
    class MyClass{
    public:
        MyClass();
        ~MyClass();
    
        void func();
    };
    

    myclass.cpp:

    #include "myclass.h"
    
    MyClass::MyClass(){
    }
    
    MyClass::~MyClass(){
    }
    
    void MyClass::func(){
    }
    

    main.cpp:

    #include "myheader.h"
    #include "myclass.h"
    
    int main(int argc, char** argv){
        MyClass mc;
        myfunc();
        return 0;
    }
    

    Wahrscheinlich steh ich nur aufm Schlauch...

    Fehlermeldung beim Linken: multiple definition of `myfunc()'



  • Versuch mal statt

    #ifndef _MYHEADER_H_
    #define _MYHEADER_H_
    

    das hier:

    #ifndef MYHEADER_H_
    #define MYHEADER_H_
    

    Hatte mit fuehrenden Underlines auch schon Probleme (VC++ 2005)

    Viele Gruesse



  • __forceinline sollte helfen, mehrfach implementiert darf das nicht sein, da meckert der linker schon zurecht, es hilft nur wenn du inlinest (wie du scheinbar schon versucht hattest). alternativ bleibt nur die implementierung aus dem header zu nehmen und in eine implementierungsdatei zu packen und nur die deklaration im header zu lassen.



  • Dein Problem ist, dass main.cpp und myclass.cpp myclass.h includen, und in myclass.h hast Du keinen Guard.

    Erweiter mal

    #include "myheader.h"
    
    class MyClass{
    public:
        MyClass();
        ~MyClass();
    
        void func();
    };
    

    in

    #ifndef MYCLASS_H
    #define MYCLASS_H
    
    #include "myheader.h"
    
    class MyClass{
    public:
        MyClass();
        ~MyClass();
    
        void func();
    };
    
    #endif
    

    Dann müsste es passen.



  • Hallo zusammen,

    @schwudde: Die führenden Underlines waren es leider nicht...

    @pub00515: Der include guard in MyClass würde nur eine Doppeldefinition von
    MyClass verhindern

    @rapso: Ein Auslagern in eine .cpp würde die Doppelimplementierung verhindern,
    allerdings möchte ich die Datei nicht in meinem Projekt haben, sondern
    in einem Library-Verzeichnis. Und da kompiliert er die .cpp ja nicht mit, so dass
    ich ein undefined reference beim Linken kriege.

    Viele Grüße,
    *Cpp-Anfänger*



  • Kannst Du die Fkt. denn nicht in eine .cpp Datei schmeißen und die myheader.h includen, wo der Prototyp steht?

    //myheader.h
    #ifndef MYHEADER_H
    #define MYHEADER_H
    
    void myfunc();
    
    #endif
    
    //myfunc.cpp
    #include "myheader.h"
    
    void myfunc()
    {
    }
    

    Edit:
    Aargh, zu wenig gelesen. Ja Du musst die Cpp Datei dann auf jeden Fall als Source Datei mit in das Projekt aufnehmen. Wo sie physikalisch liegt, ist jedoch egal.

    Oder Du includest die Cpp Datei. Ich _glaub_ das müsste auch funzen, solange sie eben nur einmal included wird.



  • Verwende inline (standard C++) für Funktionen oder __declspec(selectany) (MSVC spezifisch) für globale Daten.


Anmelden zum Antworten