Глобальные переменные в C статичны или нет? - PullRequest
17 голосов
/ 21 ноября 2010

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

Ответы [ 3 ]

32 голосов
/ 21 ноября 2010

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

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

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

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

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

7 голосов
/ 21 ноября 2010

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

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

3 голосов
/ 29 декабря 2012

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

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

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

...