Widziałem ten kod niedawno w pliku nagłówka i był zaskoczony, że to działało:Dlaczego dostępna jest statyczna zmienna przestrzeni nazw z wewnątrz metody klasy wbudowanej?
namespace NS {
static int uid = 0;
class X {
public:
static int getUID() { return uid++; }
};
}
Jeśli statyczna metoda NS::X::getUID()
nazywa się z kilku różnych C++ pliki źródłowe, byłem zaskoczony, że prawidłowo generowany unikalny identyfikator (unikalny dla jednostek tłumaczeniowych). Myślałem, że zmienna statyczna w zakresie przestrzeni nazw ma wewnętrzne powiązanie z jednostką tłumaczeniową. Co tu się dzieje? Czy wbudowana statyczna metoda w klasie X ma własną jednostkę tłumaczeniową i dlatego generuje unikalny identyfikator? Czy to działa dla mnie z powodu dziwactwa w moim kompilatorze?
Czy powyższy kod opiera się na "bezpiecznym" dobrze zdefiniowanym zachowaniu? Jeśli tak, jest to zaskakująco zwięzła metoda generowania unikalnego identyfikatora w klasie inline lub template, nawet jeśli wygląda trochę kludgy. A może lepiej wygenerować nowy plik źródłowy C++ dla statycznej funkcji unikalnego identyfikatora, takiej jak ta, i przenieść identyfikator statyczny wewnątrz klasy?
Aktualizacja:
Dla przypadku testowego, napisałem kilka funkcji, takich jak ten w różnych plików (file1.cpp, file2.cpp, etc.):
#include "static_def.h" // Name of the above header file.
void func1() {
int uid1 = NS::X::getUID();
int uid2 = NS::X::getUID();
std::cout << "File1, UID1: " << uid1 << ", UID2: " << uid2 << std::endl;
}
Wyjście zaskakujące (po wywołaniu tych z głównego):
File1, UID1: 0, UID2: 1
File2, UID1: 2, UID2: 3
Czy generuje unikatowe identyfikatory we wszystkich jednostkach tłumaczeniowych? Zamiast każdej jednostki tłumaczeniowej zaczynającej się od 0. –
było deklaracja 'uid' w pliku nagłówkowym? Lub był "uid" zdefiniowany w pliku źródłowym? –
Kto powiedział, że funkcja jest włączona? –