Unnamed Namespace



  • Hallo,

    Funktionieren namenlose namespaces mit statischen Libraries? Wie weiss der Compiler welcher Header zu welcher Lib gehört? Also:
    Der Compiler generiert anhand des Headers die Symbolnamen, welche mit dem unique namespace verziert werden. Der Linker sucht dann die Symbolnamen in den eingebundenen Libs. Dies bedingt aber, dass beim builden der Lib der gleiche, einzigartige namespace für das name mangling benutzt wurde. Wie funktioniert das? ist noch garantiert dass alle Symbole einzigartig sind? Das ist doch die Idee der unnamed namespaces, oder?

    Gruss
    Stefan



  • Die Frage stellt sich eigentlich garnicht, da der Sinn von unnamed Namespaces ja gerade ist, dass die enthaltenen Symbole nicht außerhalb einer Übersetzungseinheit sichtbar sind. Deshalb muss der Linker sie auch nicht finden können.

    Innerhalb einer ÜE sind sowohl die emittierten, wie auch die referenzierten Symbole gleich gemangled.



  • Ok, ich glaube so langsam kapiere ich es. 😉



  • Stefan schrieb:

    Funktionieren namenlose namespaces mit statischen Libraries?

    Wie meinst Du das?

    Stefan schrieb:

    Wie weiss der Compiler welcher Header zu welcher Lib gehört?

    ...muss er gar nicht.

    Stefan schrieb:

    Also:
    Der Compiler generiert anhand des Headers die Symbolnamen, welche mit dem unique namespace verziert werden. Der Linker sucht dann die Symbolnamen in den eingebundenen Libs.

    Klingt so, als wolltest Du anonyme Namensräume in Headerdateien benutzen. Dafür sind die gar nicht da! Jede Übersetzungseinheit hat quasi ihren eigenen anonymen Namensraum und all das, was Du in einem anonymen Namensraum deklarierst/definierst hat per Default "interne Bindung". Wenn Du also so etwas machst:

    ÜE1:

    namespace {
      void foo();
    }
    
    int main()
    {
      foo();
    }
    

    ÜE2:

    #include <iostream>
    
    namespace {
      void foo() {
        std::cout << "Hello!\n";
      }
    }
    

    beides kompilierst und dann versuchst zu linken, wird dich der Linker beschweren, weil es keine Definition zu foo aus ÜE1 gibt und weil das foo in ÜR2 ein ganz anderes ist (da interne Bindung!).

    Ob Du da jetzt noch die Deklaration von foo in eine Headerdatei auslagerst oder nicht, spielt keine Rolle. Dem Compiler ist das ziemlich egal, woher die Zeilen Quellcode kommen. Einbinden der Headerdateien ist nur eine reine Text-Ersetzung, sonst nichts. Man muss auch eigentlich überhaupt keine Header-Dateien benutzen. Sie sind aber sehr praktisch für öffentliche Schnittstellen der Übersetzungseinheiten.

    Stefan schrieb:

    Dies bedingt aber, dass beim builden der Lib der gleiche, einzigartige namespace für das name mangling benutzt wurde. Wie funktioniert das? ist noch garantiert dass alle Symbole einzigartig sind? Das ist doch die Idee der unnamed namespaces, oder?

    Ich glaube, diese Frage hat sich jetzt erledigt, oder?

    Gruß,
    SP



  • @Sebastian Pizer

    Ich hätte vorher wohl schreiben sollen: "Ich hab's kapiert!"
    Trotzdem Danke für deine Bemühungen. 😃


Anmelden zum Antworten