Doppelte Namespace-Definition trotz Include Guard



  • Hallo,

    Ich befasse mich erst seit relativ kurzer Zeit mit dem Thema C++.

    Ich bin in einem Lehrbuch über folgendes Problem gestolpert. Ich habe eine Headerdatei für eine Bibliothek, in der ein Namespace definiert wird. Die Implementierung dieser Bibliothek bindet die Headerdatei ein. Als letztes habe ich ein Hauptprogram, das die Headerdatei ebenfalls einbindet. Hier die drei Dateien.

    Headerdatei der Bibliothek:

    //mylibrary.h
    #ifndef MYLIBRARY_H
    #define MYLIBRARY_H
    
    namespace myspace {
    	int i;
    };
    
    void useMyLibrary();
    
    #endif
    

    Die Implementierungsdatei der Bibliothek:

    //mylibrary.cpp
    #include <iostream>
    #include "mylibrary.h"
    
    void useMyLibrary() {
    	std::cout << "Using mylibrary";
    }
    

    Das Hauptprogramm, das auf die Bibliothek zugreift:

    //main.cpp
    #include "mylibrary.h"
    
    int main() {
    	using namespace myspace;
    	i = 3;
    	useMyLibrary();
    	return 0;
    }
    

    Ich weiß, dass der Compiler eine Mehrfachdefinition des Namespaces anzeigt, da der Namespace in der Bibliothek und im Hauptprogramm über den include definiert wird. Was ich nicht verstehe ist, warum. Ich bin bisher davon ausgegangen, dass der Include Guard eine Doppeldefinition verhindert. Wer kann mir das Problem genau erklären ?

    Vielen Dank.



    1. die Fehlermeldung handelt sicher nicht von einer Mehrfachdefinition eines Namespace. Copy&Paste!
    2. i wird mehrfach definiert. Wie stellst du dir vor, wie ein Includeguard das verhindert?


  • Dein Problem hat mit Namespaces nichts zu tun, außer dass sich die Variable i eben darin befindet (ebenso wie du kein Problem mit deinem Haus hast, wenn nur die Armbanduhr, die zufällig im Haus liegt, defekt ist - das Haus ist dann der Space, in dem sich die Uhr befindet, hat aber mit dem Defekt nix zu tun). Hm, ok, sehr weit hergeholt, der Vergleich...

    Um so eine globale Variable hinzubekommen, darfst du sie nur einmalig definieren, aber beliebig oft nur deklarieren. Ansonsten gibt es Probleme beim Linken des Programms. Du könntest die Definition der Variablen i also in das mylibrary.cpp schieben und in dem Header mylibrary.h diese Variable nur deklarieren (mittels extern int i; ).

    Andererseits: fang gar nicht erst mit globalen Variablen an! Wenn du mit Namespaces herumspielen möchtest, probiere doch lieber aus, deine Funktion useMyLibrary in den Namespace zu tun. Dann Klassen in Namespaces. usw.


Log in to reply