W języku C jeżeli chcę ograniczyć zasięg obiektu do jednostki kompilacji mogę użyć słowa kluczowego static. Ja lubię mieć funkcje globalne zdefiniowane na początku, lokalne na końcu pliku, a na samym początku całą listę prototypów lokalnych funkcji, więc zwykle wygląda to tak:
Kod: Zaznacz cały
//listing 1
//prototyp
static void s_fun(void);
//funkcja o zasięgu globalnym
void g_fun(void)
{
//użycie
s_fun();
}
//definicja
static void s_fun(void)
{
...
}
W C++ w tym samym celu (ograniczenia zasięgu obiektu) mogę wykorzystać przestrzenie nazw, a w szczególności przestrzeń anonimową. A więc analogicznie wyglądało by to tak:
Kod: Zaznacz cały
//listing 2
//deklaracja funkcji lokalnej
namespace {
void s_fun();
}
void GlobNamSp::g_fun()
{
//użycie
s_fun();
}
//definicja
void s_fun() //przestrzeń anonimowa więc nie można podać nazwy -> wywala błąd
{
...
}
Jednakże powyższy zapis nie zadziała, kompilator wywala błędy. Zadziała dopiero w ten sposób:
Kod: Zaznacz cały
//listing 3
//definicja w przestrzeni
namespace {
void s_fun()
{
...
}
}
void GlobNamSp::g_fun()
{
//użycie
s_fun();
}
Co zrobić żeby jednak listing nr 2 zadziałał? (oczywiście można zamiast anonimowej przestrzeni nazw skorzystać z nazwanej)