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

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

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

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

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

2 ответа

Решение

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

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

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

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

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

Другие вопросы по тегам