Cтраница 1
Спецификатор класса памяти static, будучи примененным к глобальной переменной или функции, предотвращает ее использование любой функцией, не определенной в том же самом файле. Иногда это называют внутренней компоновкой. Глобальные переменные и функции, определение которых не предваряется static, допускают внешнюю компоновку; другие файлы могут получить к ним доступ, если содержат соответствующие объявления и / или прототипы функций. [1]
Спецификатор класса памяти register может быть помещен перед объявлением автоматической переменной, чтобы указать компилятору разместить переменную в одном из высокоскоростных аппаратных регистров компьютера. Компьютер может проигнорировать объявление register. [2]
Спецификатор класса памяти в определении функции определяет функцию как static или extern. Функция с классом памяти static доступна только в том исходном файле, в котором она определена. Все другие функции с классом памяти extern, заданным явно или неявно, доступны во всех исходных файлах, которые образуют программу. [3]
Спецификатор класса памяти register может быть помещен перед объявлением автоматической локальной переменной, чтобы рекомендовать компилятору разместить переменную в одном из быстродействующих аппаратных регистров процессора. Компилятор может игнорировать объявление register. Ключевое слово register может использоваться только с переменными, имеющими автоматический период хранения. [4]
Спецификатор класса памяти рекомендует компилятору разместить переменную в одном из регистров компьютера. [5]
Четыре спецификатора класса памяти могут быть разбиты на два типа по периоду хранения: автоматический период хранения и статический период хранения. Для объявления переменных с автоматическим периодом хранения служат ключевые слова auto и register. Переменные с автоматическим хранением создаются, когда управление получает программный блок, в котором они объявлены. Переменные этого типа существуют, пока блок активен, и уничтожаются, когда происходит выход из блока. [6]
![]() |
Использование аргументов командной строки. [7] |
В приведенном объявлении, спецификатор класса памяти extern указывает компилятору, что переменная flag либо будет определена позже в том же самом файле, либо ее определение находится в другом файле. [8]
Объявления, которые используют спецификатор класса памяти extern, не могут содержать инициализатора. [9]
Любая переменная, объявленная со спецификатором класса памяти static, может быть инициализирована константным выражением. Инициализация переменных класса static выполняется один раз во время компиляции. Если отсутствует явная инициализация, то переменные класса памяти static автоматически устанавливаются в нуль. [10]
Перед объявлением автоматической переменной может быть помещен спецификатор класса памяти register, чтобы рекомендовать компилятору разместить ее в одном из быстродействующих аппаратных регистров компьютера. Если интенсивно используемые переменные типа счетчиков или сумм будут реализованы в аппаратных регистрах, то можно исключить непроизводительные затраты на неоднократную загрузку переменных из памяти в регистры и обратно. [11]
Перед объявлением автоматической переменной может быть помещен спецификатор класса памяти register, чтобы рекомендовать компилятору разместить ее в одном из быстродействующих аппаратных регистров компьютера. Если интенсивно используемые переменные типа счетчиков или сумм будут реализованы в аппаратных регистрах, то можно исключить непроизводительные затраты на неоднократную загрузку переменных из памяти в регистры и обратно. [12]
Язык С поддерживает четыре класса памяти, обозначаемые спецификаторами класса памяти: auto, register, extern и static. Класс памяти идентификатора помогает определить его период хранения, область действия и тип компоновки. Период хранения идентификатора - это время, в течение которого данный идентификатор существует в памяти. Некоторые идентификаторы существуют короткое время, некоторые неоднократно создаются и разрушаются, другие существуют в течение всего времени выполнения программы. Область действия идентификатора характеризует возможность обращения к нему из различных частей программы. Некоторые идентификаторы доступны во всей программе, другие - только в отдельных ее частях. Эта характеристика показывает, известен ли идентификатор только в текущем исходном файле или в любом исходном файле с соответствующими объявлениями. В этом разделе рассматриваются четыре класса памяти и период хранения. В разделе 5.12 обсуждается область действия идентификаторов. В главе 14 обсуждается тип компоновки идентификатора и программирование с несколькими исходными файлами. [13]
Объявления typedef являются аналогом объявления переменной, за исключением того, что ключевое слово typedef заменяет спецификатор класса памяти. [14]
Существует два типа идентификаторов со статическим периодом хранения: внешние идентификаторы ( вроде глобальных переменных и имен функций) и локальные переменные, объявленные со спецификатором класса памяти static. Глобальные переменные и имена функций имеют по умолчанию класс памяти extern. Глобальные переменные создаются при помещении их объявлений вне любого определения функции, и они сохраняют свои значения в течение всего времени выполнения программы. Обращение к глобальным переменным и функциям возможно из любой функции, которая следует после их объявления или определения в файле. Это является одной из причин использования прототипов функций. [15]