Dinge in einem unnamed namespace haben internal linkage, d.h. sie sind von anderen .cpp Files aus nicht sichtbar. Wenn z.B. in zwei .cpp Files gleichnamige Funktionen definiert sind:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
// A.cpp
void blub()
{
std::cout << "blub A" << std::endl;
}
// B.cpp
void blub()
{
std::cout << "blub B" << std::endl;
}
|
Dann gäbe das einen Linkerfehler von wegen blub already defined in A.obj.
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
// A.cpp
namespace
{
void blub()
{
std::cout << "blub A" << std::endl;
}
}
// B.cpp
void blub()
{
std::cout << "blub B" << std::endl;
}
|
Funktioniert dagegen problemlos, die Funktion blub() in A.cpp kann dafür aber auch nur in A.cpp aufgerufen werden.
Falls es dir mal unterkommen sollte: In C löst man das mit dem Schlüsselwort static:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
// A.c
static void blub()
{
std::cout << "blub A" << std::endl;
}
// B.c
void blub()
{
std::cout << "blub B" << std::endl;
}
|
C++ unterstützt das momentan auch noch, diese Verwendung von static ist dort aber deprecated und man sollte stattdessen unnamed namespaces verwenden.