Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Задание "статического" зависит от использования вами программы.