namespace Problem



  • Der Code ist auf drei Dateien verteilt:

    Das hier ist als Header Gleit.h vorgesehen:

    namespace Gleit{
    #ifndef FEHLER
    double fehler = 0.05f;
    #define FEHLER
    #endif
    
    bool equal(float zahl_1, float zahl_2);
    
    };
    

    Bei dem #ifndef habe ich mir gedacht, dass der Header womöglich öftere Male in verschiedenen Modulen eingebunden werden könnte, und dann wäre ja die Variable fehler unerlaubter Weise mehrfach definiert.

    bei der Implementierung der Funktion sieht die Datei so aus:

    #include "Gleit.h"
    
    namespace Gleit{
    
    bool equal(float zahl_1, float zahl_2){
     return zahl_1 < zahl_2 ? zahl_2-zahl_1 < delta : zahl_1-zahl_2 < delta;
    }
    };
    

    Erhofft hätte ich mir von der Funktion, dass sich damit zwei Gleitzahlen vergleichen lassen, was ja bei == unzuverlässig ist. In einem main-Programm soll man dann einfach den 'fehler' so einstellen können, damit es für die Zwecke des konkreten Programmes dann genau genug ist.

    Also habe ich eine TestMain geschrieben, um die Funktion auszuprobieren:

    #include <iostream>
    #include "Gleit.h"
    
    using namespace std;
    using namespace Gleit;
    
    int main(){
    fehler = 0.01f; // Sollte diesmal einen anderen erlaubten Fehler einstellen
    if(eq(3.5f,3.509f))
     cout << "Identisch."
    else
     cout << "Nicht identisch."
    
    return 0;
    }
    

    Beim Kompilieren meldet mir VSC++, dass die Variable fehler angeblich mehrfach definiert ist, und deshalb ein fataler Fehler aufgetreten ist.
    Meine Hoffnungen, mittels des #ifndef Konstrukts eine mehrfache Definition der Variablen zu unterbinden, haben sich leider nicht erfüllt.

    Liegt das nur an meinem Compiler, oder wie kann ich den Code so verändern, dass man den 'Fehler' später festlegen kann. Immerhin müssen ja auch die Dateien, in denen die Funktionen des namespaces implementiert werden, von der Existenz einer Variablen 'fehler' bereits wissen.

    Mit Tipps wäre mir weitergeholfen! 🤡



  • #ifdef arbeitet ja nur pro übersetzungseinheit. wenn du dann zwei davon hast (aka zwei .cpp dateien), hast du auch deinen double zweimal drin. lösung: entweder du gibst deiner variable internal linkage (aber das würde ich dir nur bei konstanten empfehlen und da geht das automatisch) oder externe:

    //dein header
    namespace foo
    {
       extern double deine_zahl;
    }
    
    //in *einer* .cpp datei dann
    #include "header"
    
    double foo::foo; //wahlweise auch mit einem default wert initialisieren
    

    das solltest du wollen.

    allerdings hast du ein problem damit, wenn du die variable in einer übersetzungseinheit initialisierst und sie in einer anderen noch im globalen namespace verwendest. dann könnte es nämlich sein, dass du die variable uninitialisiert verwendest (und das ist schlecht).


Anmelden zum Antworten