глобальная переменная в C статична или нет?

По умолчанию глобальные переменные в C static или extern ?
Если глобальные переменные по умолчанию статичны, то это означает, что мы могли бы получить к ним доступ в одном файле, но мы также можем использовать глобальные переменные в разных файлах.
Означает ли это, что они имеют внешнее хранилище по умолчанию?

Если вы не укажете class хранения (то есть extern или static ключевые слова), то по умолчанию глобальные переменные имеют внешнюю связь. Из стандарта C99:

§6.2.2 Связи идентификаторов

3) Если объявление идентификатора области файла для объекта или функции содержит спецификатор classа хранения static , идентификатор имеет внутреннюю привязку.

5) Если декларация идентификатора для функции не имеет спецификатора classа хранения, ее привязка определяется точно так же, как если бы она была объявлена ​​с помощью спецификатора classа хранения extern . Если объявление идентификатора для объекта имеет область действия файла и спецификатор classа хранения, его связь является внешней.

Таким образом, даже если вы не укажете ключевое слово extern , globals все равно может получить доступ к другим исходным файлам (так называемые единицы перевода ), потому что они все еще могут иметь объявление extern для одной и той же переменной. Если вы используете ключевое слово static для указания внутренней привязки, то даже при наличии объявления extern для одного и того же имени переменной в другом исходном файле оно будет ссылаться на другую переменную.

В C глобальная переменная, которая не имеет инициализатора или каких-либо спецификаторов classа хранения, представляет собой предварительное определение переменной со статическим временем хранения и внешней связью .

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

Глобальные переменные в C по умолчанию являются extern .. (т. Е. Имеют внешнюю связь).

Чтобы ограничить внешнюю привязку, для глобальной переменной может использоваться «статический» class classа хранения. Если используется статический спецификатор, переменная имеет размер файла. Вы не можете связать его в другом файле с помощью ключевого слова «extern». ,

Указание «статического» зависит от использования вами программы.

  • Как я имитирую статические методы в classе с помощью easymock?
  • Как я могу получить значение переменной сеанса внутри статического метода?
  • Является ли инициализация статической членской переменной C ++ streamобезопасной?
  • Почему глобальные и статические переменные инициализируются значениями по умолчанию?
  • Почему Mockito не издевается над статическими методами?
  • Когда НЕ использовать статическое ключевое слово в Java?
  • Могут ли нестатические методы изменять статические переменные
  • Неразрешенный внешний символ для статических членов classа
  • Почему я не могу объявлять статические методы в интерфейсе?
  • Какова цель статического ключевого слова в параметре массива функции типа «char s »?
  • Какая польза от частной статической переменной в Java?
  • Давайте будем гением компьютера.