Те не се инициализират по азбучен ред и редът на инициализация между единиците за превод е недефиниран, тъй като нищо не е гарантирано от стандарта за това.
Защо глобалните променливи са зли
Глобалните променливи трябва да се избягват поради няколко причини, но основната причина е, че те значително увеличават сложността на вашата програма. Например, кажете, че разглеждате програма и искате да знаете за какво е използвана променлива с име g_nValue. Тъй като g_nValue е глобален и глобалните могат да се използват навсякъде в цялата програма, ще трябва да прегледате всеки един ред от всеки един файл! В компютърна програма със стотици файлове и милиони редове код, можете да си представите колко време би отнело това!
Второ, глобалните променливи са опасни, защото техните стойности могат да бъдат променени от всяка извикана функция и няма лесен начин за програмиста да разбере, че това ще се случи.
Защо глобалните променливи трябва да се избягват, когато са ненужни
Нелокалност -- Изходният код е най-лесен за разбиране, когато обхватът на отделните му елементи е ограничен. Глобалните променливи могат да бъдат прочетени или модифицирани от всяка част на програмата, което затруднява запомнянето или разсъждението за всяка възможна употреба.
Без контрол на достъпа или проверка на ограниченията -- Глобална променлива може да бъде получена или зададена от всяка част на програмата и всички правила относно нейното използване могат лесно да бъдат нарушени или забравени. (С други думи, get/set accessors обикновено са за предпочитане пред директния достъп до данни и това важи още повече за глобалните данни.) Като разширение, липсата на контрол на достъпа силно възпрепятства постигането на сигурност в ситуации, в които може да пожелаете да стартирате ненадежден код (като работа с плъгини на трети страни). Неявно свързване -- Програма с много глобални променливи често има тесни връзки между някои от тези променливи и връзки между променливи и функции. Групирането на свързани елементи в сплотени единици обикновено води до по-добри програми.
Проблеми с паралелността - ако глобалните могат да бъдат достъпни от множество нишки на изпълнение, синхронизирането е необходимо (и твърде често пренебрегвано). При динамично свързване на модули с глобали, съставената система може да не е безопасна за нишки, дори ако двата независими модула, тествани в десетки различни контексти, са безопасни.
Замърсяване на пространството от имена -- Глобалните имена са налични навсякъде. Може несъзнателно да използвате глобален, когато мислите, че използвате локален (чрез правописна грешка или забравяне да декларирате локалния) или обратното. Също така, ако някога трябва да свържете заедно модули, които имат едни и същи имена на глобални променливи, ако имате късмет, ще получите грешки при свързването. Ако нямате късмет, линкерът просто ще третира всички употреби на едно и също име като един и същ обект. Проблеми с разпределението на паметта -- Някои среди имат схеми за разпределяне на памет, които правят разпределянето на глобални стойности трудно. Това е особено вярно в езиците, където "конструкторите" имат странични ефекти, различни от разпределението (защото в този случай можете да изразите опасни ситуации, при които два глобала взаимно зависят един от друг). Също така, когато динамично свързвате модули, може да не е ясно дали различните библиотеки имат свои собствени екземпляри на глобали или дали глобалите са споделени.
Тестване и ограничаване - източникът, който използва глобални стойности, е малко по-труден за тестване, защото човек не може лесно да настрои "чиста" среда между изпълненията. По-общо, източникът, който използва глобални услуги от всякакъв вид (напр. четене и запис на файлове или бази данни), които не са изрично предоставени на този източник, е труден за тестване по същата причина. За комуникиращите системи възможността за тестване на системни инварианти може да изисква стартиране на повече от едно „копие“ на система едновременно, което е силно възпрепятствано от всяко използване на споделени услуги – включително глобална памет – които не са предоставени за споделяне като част от теста .
Като цяло, избягвайте глобалните променливи като основно правило. Ако трябва да ги имате, моля, използвайте Q_GLOBAL_STATIC.
Някои хора също са склонни да създават функция за обвиването им, но те не намаляват значително сложността и в крайна сметка или забравят да направят тези функции нишково-безопасни, или добавят повече сложност. Забравете да правите и това, когато можете .