Что такое класс хранения по умолчанию для глобальных переменных? - PullRequest
15 голосов
/ 19 июля 2010

Что такое класс хранения по умолчанию для глобальной переменной?

При поиске в Интернете я нашел, что некоторые сайты говорят, что это static. Но статический означает, что внутренняя связь и переменная не могут быть доступны вне области видимости файла, т.е. она не должна быть доступна для других объектных файлов. Но они все еще могут быть доступны для других файлов с помощью объявлений, таких как extern int i.

И, если я явно упомяну static о глобальной переменной, то она недоступна за пределами области действия файла.

Тогда, каков правильный класс хранения по умолчанию для глобальных переменных?

Ответы [ 2 ]

17 голосов
/ 19 июля 2010

Не существует «класса хранения по умолчанию» для того, что обычно называют «глобальными» переменными.Когда переменная определена в области имен, она всегда имеет статическая продолжительность хранения .Нет никакого способа изменить это, поэтому идея чего-то «по умолчанию» здесь не применима.(И продолжительность хранения - это то, что правильно называется.)

Когда вы применяете ключевое слово static к переменной, определенной в области имен, оно не влияет на продолжительность хранения - это уже было статично и остается статичным - но это влияет на связь .Ключевое слово static изменяет связь такой переменной с внешней (по умолчанию) на внутреннюю. Связывание - это отдельная концепция, практически не связанная с длительностью хранения .

16 голосов
/ 19 июля 2010

Срок хранения по умолчанию является статическим, но связь по умолчанию является внешней.Вы не единственный, кто находит это немного запутанным. Книга C (всегда хорошая ссылка) гласит:

«Вероятно, вы обнаружите, что взаимодействия между этими различными элементами сложны и запутаны: это потому, что они есть!"

Раздел с этой цитатой, Объявления, определения и доступность , содержит полезную таблицу (8.1).Последняя строка описывает интересующий вас случай. Как отмечается, объекты данных без спецификатора класса хранения имеют внешнюю связь и статическую длительность.

...