Namenskonflikt vermeiden



  • Nehmen wir einmal folgendes an:

    - Ich habe 2 *.cpp Files
    - jede dieser Codedateien enthält die Funktion void dasMussSoHeissen()
    - die Funktionen werden jeweils nur in der dazu gehörenden *.cpp-Datei benutzt.
    - die Funktionen dürfen aus einem mystischen Grund nicht umbenannt werden
    - die beiden Quellcodefiles wissen nichts voneinander, gehören aber zu einem Projekt.

    Wie kann ich den Namenskonflikt vermeiden, den der Compiler hier diagnostiziert, ohne den Namen der Funktion zu ändern. Ist es quasi möglich eine Function "privat" bezüglich einer Datei zu deklarieren. Also dass sie nur innerhalb der Quellcodedatei verfügbar ist?



  • private zu einer Übersetznugseinheit (cpp + alle Includes die du darin machst) -> static

    Aber besser sind hier jetzt anonyme Namespaces:

    namespace
    {
        void tolleFunktionNurHierVerwendbar();
    }
    
    ...
    
    void andereFunktion ()
    {
        tolleFunktionNurHierVerwendbar(); // Hier aufrufabr wie ganz normale Func
    }
    

    MfG SideWinder



  • Das heißt also "die betreffenden Funktionen jeweils in einen solchen anonymen Namespace kapseln" bewirkt, dass sie für die Funktionen der eigenen "Übersetzungseinheit" benutzbar bleiben, aber rein sprachlich nicht mehr mit dem Namen einer Funktion in einer anderen "Übersetzungseinheit" kollidieren, auch wenn sie gleich heißen?

    Dass klingt sehr gut. Gibt es dabei irgendwelche Nachteile die anonyme Namespaces mit sich bringen?



  • Anscheinend gibt es keine Nachteile...umso besser!



  • Glaub auch nicht, dass es da Nachteile gibt. Wurde ja extra für diesen Zweck eingeführt.

    MfG SideWinder



  • Ist ja nur eine Aussernanderhaltung für den Compiler, der Code der am Ende rauskommt, ist der gleiche, wie ohne Namespaces.



  • So ganz funktioniert das noch nicht. Wie kann ich die Funktion welche in dem Namespace steht Vorwärtsdeklarieren?

    Momentan siehts so aus...

    //----- foward declaration -----
    bool stdDrawFunc(TglObject* self);
    
    //----- constructor -----
    TglButton::TglButton()
    {
    	DoDraw = stdDrawFunc;
    }
    
    //----- standard draw function -----
    namespace
    {
    	bool stdDrawFunc(TglObject* self)
    	{
    		return true;
    	}
    }
    

    Aus mystischen Gründen die hier nicht näher beschrieben stehen, kann die Funktion nicht über dem Konstruktor geschrieben werden. Ein hinweis auf diese Möglichkeit wird als obsolet angesehen und nicht beachtet... 😉



  • 1. Sollte die Forward-Dekl. auch im anonymen Namesapce stehen!?
    2. Schreib doch einfach die gesamte Funktion drüber.

    MfG SideWinder



  • Juhu...so gehts... Danke nochmal...

    (jetzt kann mich nichts mehr aufhalten... abgesehn vom nächsten Fehler...)


Anmelden zum Antworten