Wiem, że zmienne globalne są tworzone w kolejności deklaracji dla tej samej jednostki kompilacji, a kolejność tworzenia nie jest zdefiniowana między wieloma jednostkami kompilacji.Gdy statyczna zmienna globalna jest tworzona w C++
Czytałem jakiś czas temu, że zmienne globalne są tworzone przed wywołaniem dowolnego kodu z jednostki kompilacji, w której są zdefiniowane. Czy jest to określone przez normę?
przykład:
file1.cpp
int f1v1 = f1_1();
int f1v2 = f1_2();
void f1(){...}
int f1_1(){...}
int f1_2(){...}
file2.cpp
static int f2v1 = f2_1();
static int f2v2 = f2_2();
int f2_1(){...}
int f2_2(){...}
main.cpp
#include "file1.h"
#include "file2.h"
int main()
{
f1();
return 0;
}
w tym przypadku jest gwarantowana przez normy, które f1_1()
jest wywoływane przed f1_2()
i przed f1()
? Gwarantuje standard, że f2_1()
i f2_2()
są wywoływane, ponieważ żadna funkcja zdefiniowana w pliku file2.cpp nie jest wywoływana, a f2v1
i f2v2
są niewidoczne poza plikiem file2.cpp?
EDIT:
Czy zachowanie określone przez normę gdy file1.cpp jest skompilowany w LIB1 i file2.cpp jest skompilowany w LIB2?
Możesz znaleźć ten http://stackoverflow.com/questions/12321401/ dynamiczna inicjalizacja użyteczne – hmjd
Uwaga: czy "statyczny" lub tylko efekt * powiązania * zmiennej, jej inicjalizacja jest identyczna. –
@ MatthieuM. Chciałem wyjaśnić, że zmienne nie są używane (dostęp z innego miejsca) – Felics