2010-11-21 4 views
17

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

ответ

30

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

§6.2.2 Взаимосвязи идентификаторов

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

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

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

+1

также имеет отношение : раздел 6.9.2, в котором описываются предварительные определения; В § 4 этого раздела явно показано, как взаимодействуют несколько определений переменных области видимости файла – Christoph

+0

Thanx sir ........ Не могли бы вы объяснить, что такое «статический внешний varx»? – Mishthi

+0

@ Мишти: Вы имеете в виду переменную, статичную и внешнюю? Боюсь, это невозможно. –

6

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

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

3

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

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

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

Смежные вопросы