Избегайте не-`const` глобальных переменных
Причина
Не-const глобальные переменные скрывают зависимости и делают зависимости подверженными непредсказуемым изменениям.
Пример
struct Data {
// ... много всего ...
} data; // не-const данные
void compute() // не делайте так
{
// ... используем data ...
}
void output() // не делайте так
{
// ... используем data ...
}
Кто ещё может изменить data?
Предупреждение: Инициализация глобальных объектов не полностью упорядочена. Если вы используете глобальный объект, инициализируйте его константой. Обратите внимание, что можно получить неопределённый порядок инициализации даже для объектов типа const.
Исключение
Глобальный объект часто лучше, чем синглтон.
Примечание
Глобальные константы полезны.
Примечание
Правило против глобальных переменных также применяется к переменным в области пространства имён.
Альтернатива: Если вы используете глобальные (более широко — переменные области пространства имён) данные для избежания копирования, рассмотрите передачу данных как объект по ссылке на const. Другое решение — определить данные как состояние некоторого объекта, а операции — как функции-члены.
Предупреждение: Остерегайтесь гонок данных: если один поток может получить доступ к нелокальным данным (или данным, переданным по ссылке), пока другой поток выполняет вызываемую функцию, может возникнуть гонка данных. Каждый указатель или ссылка на изменяемые данные являются потенциальной гонкой данных.
Использование глобальных указателей или ссылок для доступа и изменения не-const и в противном случае не-глобальных данных не является лучшей альтернативой не-const глобальным переменным, так как это не решает проблемы скрытых зависимостей или потенциальных состояний гонки.
Примечание
Для неизменяемых данных гонка данных невозможна.
Ссылки: Смотрите правила вызова функций.
Примечание
Правило звучит «избегайте», а не «не используйте». Конечно, будут (редкие) исключения, такие как cin, cout и cerr.
Контроль
(Простой) Сообщать обо всех не-const переменных, объявленных в области пространства имён, и глобальных указателях/ссылках на не-const данные.