Gdy masz statyczną zmienną globalną w pliku nagłówkowym C++, każda jednostka tłumaczeniowa, która zawiera plik nagłówkowy, kończy się własną kopią zmiennej.Statyczna zmienna globalna używana przez funkcję inline member
Jeśli jednak zadeklarować klasę w tym samym pliku nagłówka i utworzyć funkcję członka tej klasy, realizowanego inline w deklaracji klasy, który używa zmiennej statycznej globalnej, na przykład:
#include <iostream>
static int n = 10;
class Foo {
public:
void print() { std::cout << n << std::endl; }
};
potem widzę nieco dziwne zachowanie pod gcc 4.4:
Gdybym kompilacji bez optymalizacji, wszystkie zastosowania funkcji członka wykorzystać kopię zmiennej z jednej z jednostek tłumaczeniowych (pierwszy wspomniano na g ++ polecenia linia).
Jeśli kompiluję się z
-O2
, każde użycie funkcji składowej wykorzystuje kopię zmiennej z jednostki tłumaczeniowej, w której jest wykonywany przypadek.
Oczywiście jest to naprawdę zły projekt, więc to pytanie jest tylko z ciekawości. Jednak moje pytanie brzmi: co standard C++ mówi o tej sprawie? Czy g ++ zachowuje się poprawnie, podając inne zachowanie przy włączonej optymalizacji i bez niej?
Prawdopodobny duplikat: [statyczne słowo kluczowe w pliku h i wewnętrzne powiązanie] (http://stackoverflow.com/questions/4276794/static-keyword-in-h-file-and-internal-linkage). –