external linkage und anonyme Namespaces



  • Hi,

    nachdem ich mal wieder in Modern C++ Design gelesen habe, bin ich auf etwas gestoßen, was mich ziemlich verwirrt hat. Da meint Herr Alexandrescu:

    You can easily transform static functions into functions with external linkage by removing static and putting them into unnamed namespaces.

    ~Wen es interessiert, es steht im Kapitel Multimethoden (11.6.2)~

    Ich dachte eigentlich, dass anonyme Namespaces der moderne Ersatz für static wären und dafür sorgen, dass eine Funktion internal Linkage bekommt? Ist das doch nicht so? 😕



  • Funktionen in einem unbenannten Namensraum haben durchaus externe Linkage (weil kein static dabeisteht), allerdings wird in den Funktionsnamen noch der Name des Namensraums reingebunden - und der anonyme Namensraum bekommt eine extrem kryptische Bezeichnung, die vom akutellen Quellfile abhängt - so daß der Linker es nicht mehr schafft, die Funktion wiederzufinden. Und dadurch bleiben die Funktionen dann doch in dem Quellfile, das sie eingebunden hat.

    (ich hoffe mal, das stimmt so ungefähr)



  • @7H3 N4C3R
    Das ist ja gerade der Vorteil von anonymen Namespaces (in cpp-Dateien). Elemente darin sind genausowenig in anderen UEs sichtbar wie static deklarierte Funktionen/Variablen. Gleichzeitig besitzen die Elemente eines anonymen Namespaces aber external linkage und können damit für die Instanziierung von Templates benutzt werden.



  • @HumeSikkins: Ah okay... das macht irgendwie Sinn 🙂


Anmelden zum Antworten