Можем ли мы рассматривать глобальную статическую переменную как глобальную переменную


Вопрос в том, можем ли мы назвать переменную "глобальной переменной"? С одной стороны, A-статическая глобальная переменная, поэтому она глобальна по определению, с другой-глобальная переменная должна быть доступна в каждой точке вашей программы, а не только в текущей единице перевода. Спасибо.

#include<stdio.h>

static int A;

void main()
{
    ...
}
5 2

5 ответов:

Нет, a static не является глобальным, поскольку имеет внутреннюю компоновку. Копия будет существовать для каждого TU, который определяет его.

С одной стороны, A-статическая глобальная переменная, поэтому она глобальна по определению

Почему это статическаяглобальная переменная? Это static, да, но это все.

Глобальными переменными в C++ являются те, которые объявлены extern и определены только один раз или содержатся в виде static членов (что имеет совершенно другое значение).

Ваша переменная A имеет статическое хранилище и определена в области файла, и она имеет внутреннюю связь. Термин "глобальная переменная" - это всего лишь разговорный термин, который не совсем точно отражает все эти нюансы. Переменная, безусловно, глобальна в том смысле, что к ней можно получить доступ из любой области, и ее время жизни-от начала программы до конца программы, но из-за ее внутренней связи она не может быть доступна извне единицы трансляции, в которой она объявлена.

Я не думаю, что существует специальная, широко распространенная терминология для обозначения этих "статических глобалов"; проблема в том, что стандарт никогда не говорит о "глобальных переменных" вообще, но он различает два ортогональных понятия:

  • Время жизни переменной, которое одинаково для глобалов, "статических глобалов" и static локальных переменных; стандарт называет все они " переменными с статической длительностью хранения";
  • видимость этих переменных, которая отличается в все случаи; "глобалы" - это переменные, определенные в области глобального пространства имен с внешней связью;" статические глобалы " определяются в той же области, но с внутренней связью; наконец, локальные переменные static имеют локальную область.

Это правильнее назвать "статической глобалистами", "глобалисты"? Как уже было сказано, стандарт никогда не определяет "глобальные переменные", поэтому это должно быть делом вкуса: ониопределены в области глобального пространства имен, но они не доступны в других модули из-за того, что они имеют внутреннюю связь.

Тем не менее, имейте в виду, что, вообще, говоря о глобалах в C++, мы ссылаемся на переменные, определенные в области глобального пространства имен с внешней связью. Таким образом, в целом, я бы не назвал их глобальными, единственный неамбивалентный способ назвать их, который я вижу, - это "переменные, определенные в области глобального пространства имен с внутренней связью".

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

Думайте о нем как о переменной модуля, так как он виден одному модулю (подразумеваемому здесь как "единица перевода"), а не виден всем модулям.