Header-Include-Problem

Dieses Thema im Forum "Mac OS Entwickler, Programmierer" wurde erstellt von Spacemojo, 24.11.2005.

  1. Spacemojo

    Spacemojo Thread Starter MacUser Mitglied

    Beiträge:
    617
    Zustimmungen:
    21
    Mitglied seit:
    16.05.2004
    Hi!

    Ich kenn mich gar nicht mehr aus, bitte helfen!

    Ich habe eine C++ Datei A.cpp, in die wird ein Header X.h eingebunden mit:
    extern "C"
    {
    #include "x.h"
    }

    Wenn ich kompiliere, passt alles.

    Jetzt habe ich noch eine Datei B.cpp, in die wird genauso X.h eingebunden.
    Jetzt meldet der Compiler Fehler, nämlich multiple Definitionen von Symbolen. Anscheinend wird X.h mehrmals eingebunden.

    Aber in X.h ist der Standard-Compiler-Trick drin:
    #ifndef X_H
    #define X_H

    ... header ...

    #endif

    Warum geht das nicht?

    Der verwirrte Tobi
     
    Zuletzt bearbeitet: 24.11.2005
  2. autoexec.bat

    autoexec.bat MacUser Mitglied

    Beiträge:
    2.113
    Zustimmungen:
    20
    Mitglied seit:
    21.01.2005
    Klar. Du includierst die X.h einmal in A.h und dann weiter in A.cpp. Außerdem inkludierst du die X.h noch in B.cpp. Am Ende werden dann A.cpp und B.cpp zu einem Programm.

    Da hilft dir auch der Include-Guard (#ifndef...) nur wenig, denn die eine cpp-Datei kennt die #defines der anderen nicht. Das hilft nur innerhalb einer Übersetzungseinheit (Also cpp + zugehörige header-Dateien)

    Also wird die Headerdatei in beiden includiert. Das bereitet dem Linker in deinem Fall Kopfzerbrechen. Die Frage ist jetzt natürlich warum.

    Ich tippe auf globale Variablen in x.h? Wenn du darauf wirklich nicht verzeichten kannst.... darfst du sie in der Header-Datei nur deklarieren, nicht definieren. Sprich: In der Headerdatei muss es heißen:

    extern int c;

    In der cpp-Datei dann:

    int c = 3;
     
    Zuletzt bearbeitet: 24.11.2005
  3. Spacemojo

    Spacemojo Thread Starter MacUser Mitglied

    Beiträge:
    617
    Zustimmungen:
    21
    Mitglied seit:
    16.05.2004
    Okay,
    in der Header-Datei X.h, die in beide .cpp-Dateien eingebunden wird, sind globale Variablen drin. Das mag der Linker nicht.

    Ich will und kann aber X.h nicht ändern.

    Wie funktioniert's trotzdem?

    Tobi
     
  4. der_Kay

    der_Kay MacUser Mitglied

    Beiträge:
    1.684
    Zustimmungen:
    7
    Mitglied seit:
    02.09.2004
    Schmeiss erst mal das "extern" in der Inklusion raus. Das ist eh syntaktisch verkehrt, wenn in X.h globale Variablen deklariert sind.
    Wenn X.h sauber geschrieben wurde, enthält es
    Code:
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    ----
    
    #ifdef __cplusplus
    }
    #endif
    
    Zur Not poste mal die 3 Files als Anhang...
     
    Zuletzt bearbeitet: 24.11.2005
Die Seite wird geladen...

Diese Seite empfehlen