Область видимости
Posted By Автор не известен On In Ж | No CommentsОбластью при видимости называется часть текста программы, в которой
может быть использован определенный объект. Объект является видимым
в блоке или в исходном файле, когда в данном блоке или файле
определены имя и тип объекта. Объект может быть видимым внутри
блока, исходного файла или в каждом исходном файле, образующем
программу. Это определяется тем, на каком уровне объявлен объект:
на внутреннем (внутри определенного блока) или на внешнем (вне всех
блоков). Когда объект объявлен внутри блока, он является видимым в
данном блоке и в каждом внутреннем блоке. Когда объект объявлен на
внешнем уровне, он является видимым от точки его объявления до
завершения этого исходного файла. Объект можно сделать глобально
видимым с помощью определенных объявлений во всех исходных файлах,
образующих программу. Спецификатором класса памяти в объявлении
переменной может быть auto, register, static или extern. Если класс
памяти определен, он определяется по умолчанию из контекста
объявления. Объекты, принадлежащие классам auto и register,
обладают локальным временем жизни. Спецификаторы static и extern
задают объекты, обладающие глобальным временем жизни. В случае
объявления переменной на внутреннем уровне можно применить любой из
четырех спецификаторов класса памяти, а если его не указали, то
подразумевается auto. Переменная с классом памяти auto обладает
локальным временем жизни и видна только в блоке, в котором
объявлена. Память для данной переменной выделяется при входе в блок
и высвобождается при выходе из блока. В случае повторного входа в
блок этой переменной может быть выделен другой участок памяти.
Переменная класса auto автоматически не инициализируется, так как
она должна быть проинициализирована явно в случае объявления через
присвоение ей начального значения. Значение неинициализированной
переменной, класс памяти которой auto, считается неопределенным.
Спецификатор класса памяти register заставляет компилятор
распределить память для переменной в регистре, если это возможно.
Употребление регистровой памяти чаще всего приводит к сокращению
времени доступа к переменной. Переменная, которая объявлена с
классом памяти register, обладает той же областью видимости, что и
переменная auto. Количество регистров, которые можно применить для
значений переменных, не безгранично, так как не безграничны и
возможности компьютера. В случае когда компилятор не обладает
свободными регистрами, переменной выделяется память как для класса
auto. Класс памяти register может указываться для переменных с
типом int или указателей с размером, равным размеру int.
Переменные, которые объявлены на внутреннем уровне со
спецификатором класса памяти static, дают возможность сохранить вид
переменной при выходе из блока и применять ее при повторном входе в
блок. Данная переменная обладает глобальным временем жизни и
областью видимости внутри блока, в котором она объявлена. Для
переменных с классом static память выделяется в сегменте данных. В
отличие от них переменные класса auto имеют память, которая
выделяется в стеке. Исходя из этого, значение переменных с классом
static сохраняется при выходе из блока.