Можем ли мы рассматривать глобальную статическую переменную как глобальную переменную
Вопрос в том, можем ли мы назвать переменную "глобальной переменной"? С одной стороны, A-статическая глобальная переменная, поэтому она глобальна по определению, с другой-глобальная переменная должна быть доступна в каждой точке вашей программы, а не только в текущей единице перевода. Спасибо.
#include<stdio.h>
static int A;
void main()
{
...
}
5 ответов:
Нет, a
static
не является глобальным, поскольку имеет внутреннюю компоновку. Копия будет существовать для каждого TU, который определяет его.С одной стороны, A-статическая глобальная переменная, поэтому она глобальна по определению
Почему это статическаяглобальная переменная? Это
static
, да, но это все.Глобальными переменными в C++ являются те, которые объявлены
extern
и определены только один раз или содержатся в видеstatic
членов (что имеет совершенно другое значение).
Ваша переменная
A
имеет статическое хранилище и определена в области файла, и она имеет внутреннюю связь. Термин "глобальная переменная" - это всего лишь разговорный термин, который не совсем точно отражает все эти нюансы. Переменная, безусловно, глобальна в том смысле, что к ней можно получить доступ из любой области, и ее время жизни-от начала программы до конца программы, но из-за ее внутренней связи она не может быть доступна извне единицы трансляции, в которой она объявлена.
Я не думаю, что существует специальная, широко распространенная терминология для обозначения этих "статических глобалов"; проблема в том, что стандарт никогда не говорит о "глобальных переменных" вообще, но он различает два ортогональных понятия:
- Время жизни переменной, которое одинаково для глобалов, "статических глобалов" и
static
локальных переменных; стандарт называет все они " переменными с статической длительностью хранения";- видимость этих переменных, которая отличается в все случаи; "глобалы" - это переменные, определенные в области глобального пространства имен с внешней связью;" статические глобалы " определяются в той же области, но с внутренней связью; наконец, локальные переменные
static
имеют локальную область.Это правильнее назвать "статической глобалистами", "глобалисты"? Как уже было сказано, стандарт никогда не определяет "глобальные переменные", поэтому это должно быть делом вкуса: ониопределены в области глобального пространства имен, но они не доступны в других модули из-за того, что они имеют внутреннюю связь.
Тем не менее, имейте в виду, что, вообще, говоря о глобалах в C++, мы ссылаемся на переменные, определенные в области глобального пространства имен с внешней связью. Таким образом, в целом, я бы не назвал их глобальными, единственный неамбивалентный способ назвать их, который я вижу, - это "переменные, определенные в области глобального пространства имен с внутренней связью".
Как говорили другие, это зависит от того, почему вы заботитесь о том, чтобы он был "глобальным". В большом исходном файле статическая переменная может ввести труднопрослеживаемую связь между функциями, во многом похожую на нестатическую функцию. Разница, конечно, в том, что статическая переменная ограничена одним исходным файлом, но это небольшое утешение, если у вас есть сотни функций в этом исходном файле, которые вы должны пробираться, чтобы выяснить, откуда происходит эта неожиданная модификация.