Nie możesz kontrolować czasu życia zmiennych globalnych. Ten fakt jest najczęściej podawany ale do tego dochodzi dużo gorsza rzecz. Jeśli masz dwie zmienne globalne w dwóch plikach, to nie masz wpływu na kolejność ich utworzenia. Dajmy na to, że chcesz zrobić coś takiego:
vector<Color> colors = { Color_Red, Color_White, Color_Blue, Color_Black };
int main()
{
// tutaj uzywasz tego vectora
}
A następnie w plikach Color.hpp oraz Color.cpp
// Color.hpp
typedef std::uint32_t Color;
extern Color Color_Red;
extern Color Color_Green;
extern Color Color_Blue;
extern Color Color_White;
extern Color Color_Black;
// Color.cpp
Color Color_Red = 0xFF0000FF;
Color Color_Green = 0x00FF00FF;
Color Color_Blue = 0x0000FFFF;
Color Color_White = 0xFFFFFFFF;
Color Color_Black = 0x000000FF;
Takie coś może zadziałać a może się stać tak, że vector<Color> colors zostanie zdefiniowany przed ustawieniem wartości zmiennym Color_Red itp, przez co będzie trzymał same zera.
Dodatkowo jeśli pójdziesz dalej w programowanie, to zrozumiesz, że zamiast zmiennych globalnym można używać dużo lepszych rozwiązań - wszystko zależy od tego jak dobrze potrafisz zaprojektować kod. Zacznij korzystać z różnych wzorców projektowych.
Oczywiście nie jest tak, że nie wolno używać zmiennych globalnych. Można ale trzeba dokładnie wiedzieć jak program zadziała. Tak np. jest zaprogramowane std::cout, std::cin, std::cerr, std::clog itd.
W każdym razie, póki nie musisz ich używać to kategorycznie powinieneś się ich wystrzegać - spowodujesz sobie nimi bardzo wiele problemów. Nie tylko sobie ale też ludziom, którzy będą Ci pomagali w ich rozwiązywaniu.