Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_по_пяву_4.doc
Скачиваний:
101
Добавлен:
15.03.2015
Размер:
1.29 Mб
Скачать
  1. Объявления и определения (расширенное рассмотрение)

Объявления и определения уже обсуждались в первой части настоящего пособия в пункте 1.12. Рассмотрение этого вопроса ограничивалось наиболее простыми вариантами их применений, в которых объявлялись простые переменные встроенных типов. Во второй части пособия должны изучаться более сложные программные элементы (функции, указатели, массивы). В связи с этим представляется целесообразным вновь вернуться к рассмотрению этого вопроса.

В общем случае объявление программного элемента состоит из двух структурных частей:

  • последовательности спецификаторов.

  • списка описателей; элементы списка отделяются запятыми

Вначале объявления должна записываться последовательность спецификаторов, а затем список объявителей. Число объявителей в списке определяется числом, объявляемых имен. Объявляемое имя в качестве необязательного компонента может иметь список инициализаторов.

    1. Спецификаторы объявления

Можно выделить следующие три категории спецификаторов:

  • спецификаторы класса памяти.

  • квалификаторы типа.

  • спецификаторы типа.

      1. Спецификаторы класса памяти.

Имеются следующие спецификаторы класса памяти:

  • auto.

  • extern

  • regester

  • static

  • typedef

Класс памяти определяет время существования и вид связывания объявляемого имени. Ниже в таблице приводится назначение спецификаторов класса памяти приведено.

Спецификатор

Назначение

auto

Спецификатор допустим только в блоках и предназначен для указания на то, что переменная является локальной (автоматической). В программах обычно не используется в связи с тем, что по умолчанию локальные переменные имеют класс памяти auto.

extern

Этот спецификатор используется для указания на то, что определяемое имя имеет внешнее связывание.

register

Спецификатор применяется при работе с локальными переменными с той целью, чтобы рекомендовать компилятору хранить эту переменную в регистре. Современные компиляторы часто игнорируют эту спецификацию в связи с тем, что могут справиться с оптимизацией использования регистров лучше программиста.

static

Этот спецификатор может появляться в объявлениях функций и переменных. В объявлениях функций этот спецификатор указывает на внутренное связывание. В объявлениях переменных назначение спецификатора зависит от контекста, в котором встречается объявление. В том случае, когда объявление находится вне функций, то спецификатор указывает на внутреннее связывание. Для локальных переменных определяет размещение переменной в статической области оперативной памяти.

typedef

Определяет не имя функции или переменной, а имя типа. Имя типа располагается на месте объявителя.

      1. Квалификаторы типа

Классификаторы constиvolatileбыли введены в язык Си стандартомC89. Классификаторrestrictбыл добавлен в язык стандартом С99.

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

Квалификатор volatileпредполагает, что значение объекта может внезапно измениться. На практике переменная, привязанная к некоторому аппаратному регистру, должна быть объявлена с использование этого квалификатора. Наличие рассматриваемого квалификатора обязывает компилятор отказаться от выполнения оптимизации.

Квалификатор restrictиспользуется только с указателями и будет рассмотрен в разделе 38.