Schwammige Frage zu Includes, Abhängigkeiten und dem Linker



  • Hi,

    ich habe folgendes Problem:
    in einem größeren Projekt wird eine Klasse verwendet, die gleichzeitig noch einmal in einer dll vorhanden ist, die statisch eingebunden wird.

    - Zunächst ganz allgemein gefragt: Mit welchen Problemen muss man in einem solchen Fall rechnen?
    a) wenn die Implementation in Anwendung und dll identisch sind.
    b) wenn sie unterschiedlich sind.

    - Wie/wo entscheidet sich, welche tatsächliche Implementation aufgerufen wird bzw. welcher Header tatsächlich eingebunden wird?

    - Warum kracht es hier nicht grundsätzlich, wenn Definitionen doppelt vorkommen?

    Sorry, dass sich so allgemein frage. Mir ist nicht ganz klar, was passiert, wenn ich in irgendeinem File, in dem ich diese Klasse verwende,

    #include "MyClass.h"
    

    schreibe, weil dieser Header ja sowohl im eigentlichen Projekt als auch in der dll vorhanden ist.

    Für ein wenig Aufklärung wäre ich dankbar.



  • hallo sponge

    wenn ich dich richtig verstanden habe, gibt es dafür die folgenden präprozessor direktiven:

    #ifndef HEADER_NAME_H
        #define HEADER_NAME_H
    #endif
    

    wenn du das an den anfang deiner header datei schreibst, definierst du damit die datei mit einer symbolischen konstante und verhinderst so mehrfaches einbinden. der compiler merkt anhand der direktive, das (wenn zutreffend) die datei bereits an diese stelle eingebunden wurde und repertiert es nicht ein weiteres mal.



  • habe noch etwas vergessen. das #endif muss ans ende der datei weil der compiler ignoriert den ganzen code inerhalb der direktive wenn die bedingung fehlschlägt. also:

    #ifndef HEADER_NAME_H
        #define HEADER_NAME_H
    
        //.....dein ganzer header code....
    
    #endif
    

    übrigends ist dann für denn dll type ein #define sehr nützlich:

    #ifndef HOST_ANWENDUNG
        #define DLL_TYPE dllexport
    #else
        #define DLL_TYPE dllimport
    #endif
    


  • Hi!
    Danke für die Antwort!

    krakki schrieb:

    habe noch etwas vergessen. das #endif muss ans ende der datei weil der compiler ignoriert den ganzen code inerhalb der direktive wenn die bedingung fehlschlägt. also:

    #ifndef HEADER_NAME_H
        #define HEADER_NAME_H
    
        //.....dein ganzer header code....
    
    #endif
    

    Dass man ein doppeltes Einbinden auf diese Weise verhindern kann, ist mir eigentlich klar. (Meine Frage nach doppelten Definitionen war deshalb Blödsinn, sorry.)
    Mir ging es eher darum, ob sich irgendwie vorhersagen lässt, welcher der beiden Header eingebunden wird, insbesondere dann, wenn sich die Version in der dll von der in der eigentlichen Applikation unterscheidet.


Anmelden zum Antworten