Являются ли глобальные переменные в C static
или extern
по умолчанию?
Если глобальные переменные по умолчанию являются static
это означает, что мы сможем получить к ним доступ в одном файле, но мы также можем использовать глобальные переменные в разных файлах.
Означает ли это, что у них есть extern
хранилище по умолчанию?
Глобальные переменные в C статичны или нет?
Ответ 1
Если вы не укажете класс хранения (то есть ключевые слова extern
или static
), то по умолчанию глобальные переменные имеют внешнюю связь. Из стандарта C99:
§6.2.2 Связи идентификаторов
3) Если объявление идентификатора области файла для объекта или функции содержит спецификатор класса хранения
static
, идентификатор имеет внутреннюю привязку.5) Если декларация идентификатора для функции не имеет спецификатора класса хранения, ее привязка определяется точно так, как если бы она была объявлена с помощью спецификатора класса хранения
extern
. Если объявление идентификатора для объекта имеет область действия файла и спецификатор класса хранения, его связь является внешней.
Таким образом, даже если вы не укажете ключевое слово extern
, глобальные глобальные значения могут быть доступны другим исходным файлам (так называемые единицы перевода), поскольку они могут иметь объявление extern
для той же переменной. Если вы используете ключевое слово static
для указания внутренней привязки, то даже при наличии объявления extern
для одного и того же имени переменной в другом исходном файле оно будет ссылаться на другую переменную.
Ответ 2
В C глобальная переменная, которая не имеет указателей инициализатора или любого класса хранения, представляет собой предварительное определение переменной со статической продолжительностью хранения и внешней связью.
В блоке трансляции все предварительные определения и до одного непреднамеренного определения (например, из объявления с инициализатором) сворачиваются в одно определение переменной. Хотя это не позволяет определять одну и ту же переменную в нескольких единицах перевода, это общее расширение, позволяющее "общим" переменным, то есть предварительным определениям одной и той же переменной в нескольких единицах перевода.
Ответ 3
Глобальные переменные в C по умолчанию являются extern.. (то есть они имеют внешнюю связь).
Чтобы ограничить внешнюю привязку, для глобальной переменной можно использовать спецификатор класса статических данных. Если используется статический спецификатор, переменная имеет область действия файла. Вы не можете связать ее в другом файле, используя "extern 'ключевое слово..
Задание "статического" зависит от использования вами программы.