Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы программирования на языке C_4.docx
Скачиваний:
46
Добавлен:
25.03.2016
Размер:
299.55 Кб
Скачать

Внешние статические переменные

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

Регистровые переменные

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

Пример:

main( )

{

register int pleat;

}

Компилятор сравнивает наши требования с количеством доступных регистров, поэтому мы можем и не получить то, что хотим. В этом случае переменная становится простой автоматической переменной.

Особенности работы с языком Си. Какой класс памяти применять? Ответ на вопрос - автоматический. Этот класс памяти выбран по умолчанию. Использование внешних переменных очень соблазнительно. Если описать все переменные как внешние, то не будет забот при использовании аргументов и указателей для связи между функциями в прямом и обратном направлениях. Но тогда возникает проблема с функцией С, изменяющей переменные в функции А, а мы этого не хотели! Такая проблема значительно перевешивает кажущуюся привлекательность широкого использования внешних переменных. Одно из золотых правил программирования заключается в соблюдении принципа "необходимо знать только то, что нужно". Организуйте работу каждой функции автономно, насколько это возможно, и используйте глобальные переменные только тогда, когда это действительно необходимо!

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

Подведем итог.

Классы памяти, которые описываются внутри функции:

  1. автоматический, продолжительность существования - временно, область действия - локальная;

  2. регистровый, продолжительность существования - временно, область действия - локальная;

  3. статический, продолжительность существования - постоянно, область действия - локальная.

Классы памяти, которые определяются вне функции:

  1. внешний, продолжительность существования - постоянно, область действия глобальная (все файлы);

  2. внешний статический, продолжительность существования - постоянно, область действия - глобальная (один файл).

Лекция 11. Препроцессор языка Си

Общие сведения. Символические константы: #define. Использование аргументов с #define. Макроопределение или функция? Включение файла #include. Условная компиляция.

Общие сведения

В интегрированную среду подготовки программ на Си или в компилятор языка как обязательный компонент входит препроцессор. Назначение препроцессора - обработка исходного текста программы до ее компиляции. Препроцессорная обработка включает несколько стадий, выполняемых последовательно. Конкретная реализация может объединять несколько стадий, но результат должен быть таким, как если бы они выполнялись в следующем порядке:

  1. Все системно-зависимые обозначения перекодируются в стандартные коды.

  2. Каждая пара из символов ' \ ' и "конец строки" вместе с пробелами между ними убираются, и тем самым следующая строка исходного текста присоединяется к строке, в которой находилась эта пара символов.

  3. В тексте распознаются директивы и лексемы препроцессора, а каждый комментарий заменяется одним символом пустого промежутка.

  4. Выполняются директивы препроцессора и производятся макроподстановки.

  5. Эскейп-последовательности в символьных константах и символьных строках заменяются на их эквиваленты.

  6. Смежные символьные строки конкатенируются, то есть соединяются в одну строку.

  7. Каждая препроцессорная лексема преобразуется в текст на языке Си.

Поясним, что понимается под препроцессорными лексемами или лексемами препроцессора. К ним относятся символьные константы, имена включаемых файлов, идентификаторы, знаки операций, препроцессорные числа, знаки препинания, строковые константы и любые символы, отличные от пробела.

Стадия обработки директив препроцессора. При ее выполнении возможны следующие действия:

  • замена идентификаторов заранее подготовленными последовательностями символов;

  • включение в программу текстов из указанных файлов;

  • исключение из программы отдельных частей ее текста, условная компиляция;

  • макроподстановка, то есть замена обозначения параметризованным текстом, формируемым препроцессором с учетом конкретных аргументов.