Что такое класс хранения по умолчанию для глобальных переменных?
Что такое класс хранения по умолчанию для глобальной переменной?
При поиске в Интернете я нашел, некоторые сайты говорят, что это static
, Но статический означает, что внутренняя связь и переменная не могут быть доступны вне области видимости файла, т.е. не должны быть доступны для других объектных файлов. Но они все еще могут быть доступны для других файлов с помощью объявлений, таких как extern int i
,
И, если я прямо упомяну static
к глобальной переменной, то она не доступна за пределами области видимости файла.
Тогда, что является правильным классом хранения по умолчанию для глобальных переменных?
2 ответа
Срок хранения по умолчанию является статическим, но связь по умолчанию является внешней. Вы не единственный, кто находит это немного запутанным. Книга Си (всегда хорошая ссылка) гласит:
"Вы, вероятно, найдете взаимодействия между этими различными элементами сложными и запутанными: это потому, что они есть!"
Раздел с этой цитатой, Объявления, Определения и Доступность, имеет полезную таблицу (8.1). Последняя строка описывает интересующий вас случай. Как отмечается, объекты данных без спецификатора класса хранения имеют внешнюю связь и статическую длительность.
Не существует "класса хранения по умолчанию" для того, что обычно называют "глобальными" переменными. Когда переменная определена в области имен, она всегда имеет статическую продолжительность хранения. Нет никакого способа изменить это, поэтому идея чего-то "по умолчанию" здесь не применима. (А продолжительность хранения - это то, что правильно называется.)
Когда вы применяете ключевое слово static
переменная, определенная в области имен, не влияет на продолжительность хранения - она уже была статической и остается статической - но влияет на ее связь. Ключевое слово static
изменяет связь такой переменной с внешней (по умолчанию) на внутреннюю. Связывание - это отдельная концепция, практически не связанная с продолжительностью хранения.