Rozważ wprowadzenie jednej zmiennej obsługiwanej przez jeden plik .cpp
, podczas gdy inne pliki .cpp
używają tej wartości zmiennej do różnych celów.Zmienna między dwoma plikami źródłowymi (klasa i globalna)
przypadku korzystania z zajęć
// header.h
class c {
public:
static int f1();
static int f2();
private:
static int v;
};
// first.cpp
int c::v(0);
int c::f1() { return ++v; }
// second.cpp
int c::f2() { return ++v; }
// main.cpp
int main() {
cout << c::f1() << endl;
cout << c::f2() << endl;
return 0;
}
wyjściowa wynosi:
1
2
Przy stosowaniu w zakresie globalnym
// header.h
int f1();
int f2();
static int v = 0;
// first.cpp
int f1() { return ++v; }
// second.cpp
int f2() { return ++v; }
// main.cpp
int main() {
cout << f1() << endl;
cout << f2() << endl;
return 0;
}
wyjściowa wynosi:
1
1
Jak to się stało, gdy wspomniany zmienną jest klasą, wyjście jest to, czego się spodziewać i nie jest inaczej? (Zdaję sobie sprawę, że za pomocą extern
w drugiej części dałoby upragnionego rezultatu, sprawa jest raczej dlaczego static
robót budowlanych w przypadku z klasą, ale nie o zasięgu globalnym?)
Czy rozumiem poprawnie: każdy plik otrzymuje własną kopię tej zmiennej? Tak więc, jeśli OP gdzie umieścić 'f1()' i 'f2()' w tym samym pliku, to faktycznie dostałby '1' i' 2' jako wynik? Co więcej, gdyby nie zadeklarował 'v' jako' statycznego', to wszystkie pliki podzieliłyby tę zmienną i znowu wynik byłby '1' i' 2'? – dingalapadum
@dingalapadum Całkowicie zgadzam się z pierwszą częścią. Jeśli chodzi o drugą część, nie całkiem - możesz mieć rację co do zasady, ale w tym przypadku linker będzie narzekał na zmienną mającą wiele definicji. –
Rozumiem. Dziękuję Ci! – dingalapadum