- •Московский государственный социальный университет академия информатики и информационных технологий
- •Введение
- •Часть. Основы программирования на Си
- •1.1. Структура простейшей Си-программы
- •1.2. Данные в Си и операции над ними
- •1.2.1. Свойства ячейки памяти. Переменные и константы
- •1.2.2. Типы данных в Си
- •1.2.3. Правила записи констант в Си
- •1.2.4. Описание переменных и именованных констант в Си.
- •1.2.5. Выражения в Си
- •1.3. Операторы преобразования данных
- •1.3.1. Общие положения
- •1.3.2. Функция форматного выводаprintf()
- •1.3.3. Функция форматного вводаscanf()
- •1.4. Разработка программ на Си
- •1.4.1. Понятие о качестве программы и основные технологические принципы разработки программ
- •1.4.2. Алгоритм и способы его записи.
- •1.4.3. Изображение алгоритмов в виде блок-схем
- •1.4.4. Базовые структуры алгоритмов и их кодирование на Си.
- •1. Следование
- •2. Разветвление (развилка)
- •If (условие)
- •If (условие)
- •3. Цикл
- •1.4.4. Примеры разработки программ
- •1.5. Массивы и указатели
- •1.5.1. Понятие массива. Основные правила работы с массивами в Си
- •1.5.2. Примеры программ с массивами.
- •1.5.3. Инициализация массивов
- •1.5.4. Указатели в Си10
- •1.5.5. Связь массивов с указателями в Си
- •Часть. Функции и многофайловые программы в Си
- •2.1. Общие сведения о подпрограммах и функциях
- •2.2. Функции си
- •2.2.1. Описание функции
- •2.2.2. Обращение к функции
- •2.2.3. Место описания функции в программе
- •2.2.4. Примеры программ, использующих функции
- •2.3. Краткие сведения о препроцессоре Си
- •2.3.2.Директива макроопределения #define
- •2.3.3. Директива #include включения файлов
- •2.3.4. Директивы условной компиляции
- •2.415. Многофайловые си-программы
- •2.4.1. Структура программы на Си. Область действия переменных
- •2.4.2. Время жизни и класс памяти переменных
- •Описатели класса памяти
- •2.4.3 Понятие о файле проекта
- •Часть. Обработка символьной информации и документов сложной структуры
- •3.1. Обработка символьной информации на Си
- •3.1.1. Символьный тип
- •3.1.2. Работа со строками символов в Си. Строковые литералы. .
- •3.1.3. Функции и макросы для работы с символьной информацией
- •3.1.4. Примеры программ
- •3.2. Тип "структура" в Си
- •Структура
- •3.3. Файлы в Си
- •3.3.1. Общие понятия.
- •3.2.Функции Си для работы с файлами
- •3.3.3. Примеры программ, использующих файлы
- •Литература
- •Содержание
2.3. Краткие сведения о препроцессоре Си
Получение исполняемой программы (с расширением .exe) из исходного текста на языке Си происходит в несколько этапов. На самом первом этапе с исходным текстом программы работает специальная программа - препроцессор. Основная цель препроцессора - закончить формирование исходного текста программы на Си. Затем окончательный текст программы подвергается компиляции, в результате которой генерируется объектный файл. После этого компоновщик формирует загрузочный модуль. Обычно препроцессор вызывается компилятором автоматически. Однако при необходимости можно использовать автономную программу препроцессора CPP.EXE. Результатом ее работы является окончательно сформированный препроцессором файл со всеми включенными файлами и другими выполненными директивами препроцессора.
Возможный вид команды вызова препроцессора:
СРР -Р- IДиректория ИмяИсхФайла
где ИмяИсхФайла - имя файла с расширением .с или .срр, -Р- отключение опции вывода номеров строк в результирующем файле, IПуть - опция указания директории, где находятся включаемые файлы.
О других опциях программы СРР можно узнать, вызвав ее без параметров. Результатом работы препроцессора является текстовый файл с тем же именем, что и исходный, но с расширением .i.
Директивы препроцессора позволяют заменять сокращения (так называемые макро) на полный текст, отыскивать необходимые файлы и вставлять в программу их содержимое, влиять на условия компиляции и выполнять некоторые другие функции (распознавать модель памяти, выводить сообщения об ошибках и др.).
Директивы препроцессора (иногда называемые командными строками) начинаются со знака #в первой позиции строки.
2.3.2.Директива макроопределения #define
Директива #defineопределяет макро (макрос, макроопределение).
Общий вид директивы:
#define Имя_МакроПоследовательность_Символов
Каждое вхождение Имя_Макрозаменяется препроцессором наПоследовательность_Символов. Процесс замены называетсярасширением макро. Расширению не подлежат группы символов, входящие в состав комментариев, строковых литералов и символьных констант.
Директиву #define можно отменить директивой #undef:
#undef ИмяМакро
После директивы #undef ИмяМакро становится неопределенным.
Наиболее распространенное применение #define - это обозначение часто встречающихся констант, числовых и строковых. Например,
#define N 100
#define PRIGL "Введите исходные данные"
Принято для обозначения макро использовать большие буквы, так же как малые для имен переменных программы (но это не обязательно).
Если последовательность символов не помещается на одной строке, то для переноса используется символ \:
#define PRIMER "Наш текст не помещается\
на одной строке"
Макро может иметь параметры. Каждый раз при расширении параметры заменяются параметрами макро в программе. Общий вид описания макро с параметрами:
#define Имя_Макро(Список_Параметров) Тело_Макро
Пример:
#define square(x) ((x)*(x)) /*макро с формальным параметром*/
... int i,j; ...
j=square(i); /*расширяется в j=((i)*(i)) */
Аргумент макро необходимо заключать в круглые скобки, чтобы вместо формального параметра можно было подставлять выражение. Пример "неприятности" при отсутствии скобок:
#define square(x) x*x /*макро с форм. параметром без скобок*/
... int i,j,l;...
j=square(i+l);/*расширяется в j=i+l*i+l -нет перемножения аргументов*/
Макро с параметрами похожи на процедуры - но только на первый взгляд! Отличия макро от процедур:обращение к процедуре генерируетв объектном модулекоманду безусловного перехода с возвратом и передачу параметров, обращение к макро приводит к вставкев исходную программу тела макро; поэтому применение макро увеличивает код программы, но экономит время выполнения (за счет отсутствия пересылки параметров).
Обычно не рекомендуется использовать макро вместо процедур, так как при применении макро отсутствует всякий контроль правильности подстановки параметров.
Существуют предопределенные макро, имена которых нельзя использовать в других целях. Примеры таких макро вBorland C++.
__DATE__ строка - месяц/день/год получения объектного модуля;
__TIME__ строка - часы:минуты:секунды - время начала компиляции;
__FILE__ строка, содержащая имя компилируемого файла;
__COMPACT__, __HUGE__, __LARGE__ , __MEDIUM__, __SMALL__, __TINY__ задают используемую модель памяти; причем определен один из этих макросов;
макро __сplusplus определено равным 1 для программ, компилируемым в среде Turbo C++ или Borland C++; в остальных случаях неопределено.