область действия переменной c в c - PullRequest
0 голосов
/ 03 февраля 2020

Я читаю книгу K & R. В разделе 4.6 говорится: объявления stati c, применяемые к внешним переменным или функциям, ограничивают область действия этого объекта остальной частью компилируемого исходного файла. Я путаюсь с областью действия stati c внешних переменных , когда пишется с ключевым словом extern в разных исходных файлах.

1 Ответ

3 голосов
/ 03 февраля 2020

Любой идентификатор, объявленный вне функции, имеет область действия файла . Объявление видимо только внутри текущего модуля перевода , который является одним исходным файлом вместе со всеми файлами, включенными в директиву предварительной обработки #include.

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

Когда объявление для объекта включает static, идентификатор имеет внутреннюю связь . Это означает, что другие объявления внутри того же модуля перевода с внутренней связью будут ссылаться на тот же объект, но объявления в другом модуле перевода не будут ссылаться на тот же объект.

Обратите внимание, что по историческим причинам c Есть несколько значений и эффектов, связанных с stati c и external . Все объявления вне функций (включая объявления функций) являются внешними объявлениями на языке стандарта C, даже если они включают static. В этом использовании «внешний» означает вне функции. Что касается фразы внешняя связь , «внешняя» относится к связи вне единицы перевода. В объявлениях ключевое слово static может влиять как на связывание (изменяя его по умолчанию на внешнее, когда оно находится вне функции, так и на отсутствие связывания, когда внутри функции), а также на продолжительность хранения (изменяя его по умолчанию на automati c внутри функции до stati c длительность хранения ). Можно также сказать, что определение int a[5] является определением stati c в том смысле, что размер массива фиксирован. К сожалению, мы просто застряли с этими множественными эффектами и значениями, и вам придется выучить их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...