Можно ли использовать глобальные переменные, когда они используются только в одном файле? Являются ли глобальные переменные const / constexpr нормальными для использования? - PullRequest
0 голосов
/ 01 марта 2020

Я понимаю, что по возможности следует избегать глобальных переменных по нескольким причинам:

  1. Трудно отлаживать, если глобальная переменная имеет недопустимое значение (поскольку каждая функция имеет к ней доступ )

  2. Для нескольких глобальных переменных в нескольких файлах, если есть какие-либо зависимости от глобальных переменных (например, если у вас есть a = 1; в одном файле и extern a; b = + 1; в другом файле) значения этих переменных будут неопределенными, поскольку мы не можем знать порядок вычисления этих выражений.

Являются ли глобальные переменные const или constexpr в целом нормально использовать? Так как они никогда не могут быть записаны, первая точка не затрагивает их, и глобальные переменные constexpr оцениваются компилятором до времени выполнения, поэтому вторая точка к ним не относится. Кроме того, если вы используете только константные переменные в файле, в котором они определены, вторая точка также не будет применяться к ним.

Также, возможно, существуют ситуации, когда использование неконстантных глобальных переменных действительно удобно , Предполагая, что они используются только в одном файле, поэтому порядок оценки единиц перевода не имеет значения, стоит ли использовать небольшое количество глобальных переменных, когда они действительно упрощают ваш код? (например, вам не нужно будет передавать локальные переменные по ссылке на различные функции из main).

1 Ответ

1 голос
/ 01 марта 2020

const "глобальные" константы в порядке - но поместите их в свое собственное пространство имен. Ниже приведен пример такого рода вещей, которые довольно распространены. Они не существуют в глобальном пространстве имен, поэтому не являются глобальными.

    namespace ApproximateMathConstants{
      const double pi = 3.0;
      const double e = 2.0;
    }

Если вы хотите сохранить глобальную переменную, как в вашем примере, чтобы избежать передачи стольких параметров, лучшим вариантом может быть заключаться в инкапсуляции некоторых из этих параметров в объект класса. Или превратите функции в функции / методы-члены для класса, который будет иметь доступ к переменным-членам.

Помимо проблем, о которых вы уже упоминали, глобальные переменные могут позже вызвать много других непредвиденных проблем, которые будут чрезвычайно трудно отлаживать; например, что произойдет, если вы запустите свой код в более чем одном потоке?

Кроме того, если у вас есть функция, зависящая от некоторой глобальной переменной, то вызов дважды одной и той же функции с одинаковыми входными данными приведет к приводят к разным результатам (если нет, зачем вообще иметь глобальный). Хотя это может быть тем, что вам нужно, это может привести к очень странному и неожиданному поведению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...