Sinn von unnamed namespaces
-
Einfache Frage.... eigentlich.
-
Raptor schrieb:
Einfache Frage.... eigentlich.
macht static linkage.
static int foo(){//soll nicht mehr sein return 1; } static int x;//soll nicht mehr sein
namespace{ int foo(){//ok return 1; } int x;//ok }
-
volkard schrieb:
Raptor schrieb:
Einfache Frage.... eigentlich.
macht static linkage.
Das ist nicht ganz korret. Im Gegensatz zu einer als statische definierten Funktion, die internal linkage (manchmal auch static linkage genannt) hat, hat eine Funktion in einem unnamed namespace *external* linkage. Allerdings wird für eine Funktion in einem unnamed namespace, genau wie für eine statische Funktion, *kein* externes Symbol erzeugt. Eine solche Funktion kann also nur der Übersetzungseinheit referenziert werden, in der sie definiert ist, nicht aber von außerhalb.
Eine Funktion in einem unnamed namespace verhält sich also prinzipiell wie eine static Funktion mit einem wichtigen Unterschied: da alle Elemente eines unnamed namespace external linkage haben können sie als Templateargumente verwendet werden.
Sprich:
static void func() {} namespace { void func2() {} } template <void (*)()> struct Foo {}; int main() { Foo<&func> f; // illegal Foo<&func2> q; // legal }