Anonimowa przestrzeń nazw

W tym miejscu zadajemy pytania na temat języka C++, dzielimy się swoją wiedzą, udzielamy wsparcia, rozwiązujemy problemy programistyczne.
Awatar użytkownika
xor
User
User
Posty: 169
Rejestracja: poniedziałek 05 wrz 2016, 21:44

Anonimowa przestrzeń nazw

Postautor: xor » poniedziałek 14 maja 2018, 23:09

Na początek trochę tła.
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)

Awatar użytkownika
piotrek
User
User
Posty: 155
Rejestracja: niedziela 05 lis 2017, 02:46

Re: Anonimowa przestrzeń nazw

Postautor: piotrek » wtorek 15 maja 2018, 01:08

u mnie działa:

Kod: Zaznacz cały

#include <iostream>

using namespace std;

namespace {
   void fun(void);
}

namespace {
   void fun() {
      cout << "aaa" << endl;
   }
}
namespace GlobNamSp {
   void g_fun()
   {
      fun();
   }
}

int main() {
   GlobNamSp::g_fun();
   return 0;
}

Awatar użytkownika
xor
User
User
Posty: 169
Rejestracja: poniedziałek 05 wrz 2016, 21:44

Re: Anonimowa przestrzeń nazw

Postautor: xor » wtorek 15 maja 2018, 08:25

Już chciałem zauważyć że definicję masz przed użyciem funkcji a chodziło o to by była po ale już OK, rozwiązanie jest jednak gdzie indziej: definicja jest umieszczona wewnątrz bloku "namespace { ...}". A więc mój listing nr 2 powinien wyglądać tak:

Kod: Zaznacz cały

//listing 2
//deklaracja funkcji lokalnej
namespace {
   void s_fun();
}

void GlobNamSp::g_fun()
{
   //użycie
   s_fun();
}

//definicja
namespace {
   void s_fun()
   {
       ...
   }
}


Dzięki :-)


Wróć do „Pisanie programów w C++”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 3 gości