Класс хранения и область действия - это разные вещи. Ключевое слово static
не влияет на область видимости.
Класс хранения связан с продолжительностью жизни или продолжительностью хранения объекта: когда он создан и когда его срок службы заканчивается. К сожалению, существует некоторое смешение класса хранения и других концепций из-за исторических причин. Класс хранения имеет некоторые коннотации о , где что-то хранится. C развился так, что решение о том, где что-то хранится, в значительной степени зависит от реализации. Обычно программисту нужно только заботиться о , когда что-то хранится.
Класс хранения - это свойство объекта: Фактическая вещь (значение) хранится. Scope - это свойство идентификатора: имя, используемое для ссылки на объект (или тип или функция).
Существует четыре периода хранения: статические, потоковые, автоматические и распределенные. Существует четыре вида областей: функция, файл, блок и прототип функции. Правила для них несколько сложны (а также зависят от связи, которая может быть внешней, внутренней или ни одной), поэтому я не буду описывать их все.
Если вы определяете объект как static
, его время жизни - это полное выполнение программы. По умолчанию обычный объект, объявленный внутри тела функции, имеет автоматическую продолжительность хранения. Его время жизни зависит от выполнения временной программы в том блоке, в котором он находится, пока выполнение программы не выйдет из блока, в котором он находится. Каждый раз, когда выполнение входит в блок, создается новый экземпляр объекта. Как вы можете видеть, срок службы - это свойство, которое применяется, когда программа запущена.
Когда вы объявляете объект внутри тела функции, идентификатор (имя) в объявлении имеет область действия блока. Имя отображается только внутри блока. Область действия - свойство времени компиляции; это влияет на то, какие части исходного кода могут видеть имя. Например, если ваша функция A вызывает функцию B во время выполнения, функция B не может видеть имена внутри функции A. Даже если объекты в функции A существуют (свойство времени выполнения), а функция B выполняется, их имена (компиляция -time) не видны в функции B.
Имя внутри тела функции имеет область видимости блока, но может относиться к объекту с автоматическим (блочным) хранением или к объекту со статическим (целым программным) хранилищем продолжительность.
Когда вы объявляете объект вне тела функции, его идентификатор имеет область действия. Он отображается всем последующим исходным кодом в файле.
Существует также свойство, называемое связью.Связывание - это метод, с помощью которого один и тот же идентификатор в разных областях может быть сделан для обращения к одному и тому же объекту. (foo
в одном исходном файле может быть сделан для ссылки на тот же объект, что и foo
другого исходного файла.)
Asterisk - внешние эффекты внешнего вида (другие файлы), но не Внутренний (текущий файл 0. Очень важно отметить это. –
@ RichardJ.RossIII Это называется * linkage * идентификаторов, а не области. – Jens
@Jens, конечно, это связано с привязкой, но вполне возможно, что C, t связан (работает как скрипт), тем самым делая его * внешним * областью более технически. –