In C ++ weiß ich, dass, wenn ich eine Funktion mit static deklariere, sie nur in der Kompilierungseinheit existiert, in der sie deklariert / definiert ist:
%Vor%Wenn ich meine Funktion in einem anonymen Namespace deklariere, ist ihr Name nur in der lokalen Kompilierungseinheit vorhanden:
%Vor%Ich kann auch static im anonymen Namespace verwenden:
%Vor%Gibt es einen Unterschied zwischen diesen Definitionen?
Danke
Ja, es gibt einen Unterschied.
Erstens, lassen Sie uns genau sein, sogar bis zu dem Punkt, pedantisch zu sein: Die Namen existieren überall. Die Unterscheidung ist:
Wenn ein Symbol% co_de% (im Namensraumbereich) deklariert ist, hat es interne Verknüpfung, was bedeutet, dass der gleiche Name in einem anderen Übersetzungseinheit bezieht sich auf eine andere Entität.
Ein unbenannter Namespace generiert einen Namespace, dessen Name lautet einzigartig für die Übersetzungseinheit. Das Symbol hat immer noch extern Verknüpfung (vorausgesetzt, es ist nicht statisch), aber Sie können es nicht Benennen Sie es in einer anderen Übersetzungseinheit.
Der Hauptunterschied betrifft Vorlagen. Zumindest bis C ++ 11 (und vielleicht immer noch, ich habe es nicht überprüft), jede Entität, die es gewohnt ist Instanziieren einer Vorlage muss externe Verknüpfung haben. Also könntest du nicht instanziieren eine Vorlage auf etwas statisch deklariert, oder was implizit interne Verknüpfung hatte.
Tags und Links c++