
- •Часть 1. Основы создания программ в Си Лекция.1.Язык Си
- •Технология разработки программ
- •Базовые элементы языка Си
- •Представление данных в Си
- •Встроенные типы данных
- •Переменные
- •Операции и выражения
- •Функции
- •Лекция.2.Язык Си Обзор элементов языка Си Типизированные константы
- •Область действия переменных
- •Управляющие конструкции с
- •Массивы и указатели
- •Типы, определяемые пользователем
- •Лекция.3.Препроцессор и отладка программ
- •Макроопределения
- •Условная компиляция
- •1. Предотвращение включения файлов
- •Отладка программ
- •Элементы отладки
- •Лекция.1.Объектно-ориентированное программирование
- •Что такое объектно-ориентированное программирование
- •Пример определений классов
- •Конструктор и деструктор
- •Элементы класса
- •Элементы-функции
- •Элементы данных
- •Класс как область действия
- •Указатель this
- •Лекция.3.Элементы класса Статические элементы класса
- •Статические элементы-функции
- •Специальные элементы-функции класса
- •Конструктор
- •Список инициализации элементов
- •Конструктор копии
- •Операция присваивания
- •Деструктор
- •Операции класса new и delete
- •Функции преобразования
- •Ключевое слово explicit
- •Операции приведения
- •Доступ к базовым классам
- •Простое наследование
- •Конструкторы, деструкторы и наследование
- •Сложное наследование
- •Неоднозначности при сложном наследовании
- •Виртуальные базовые классы
- •Виртуальные функции
- •Чисто виртуальные функции и абстрактные классы
- •Реализация виртуального механизма
- •Лекция.5.Семинар 1-2: Обработка исключений
- •Объекты-исключения
- •Повторное возбуждение исключения
- •Перехват всех исключений
Лекция.3.Препроцессор и отладка программ
Препроцессорная обработка представляет собой первую фазу того процесса, что именуется компиляцией программы на C/C++.
Макроопределения
Макроопределения, называемые в просторечии макросами, определяются директивой препроцессора #define. Можно выделить три формы макросов #define: простое определение символа, определение символической константы и определение макроса с параметрами.
Простое определение выглядит так:
#define NDEBUG
После такой директивы символ ndebug считается определенным Не предполагается, что он что-то означает; он просто — определен (как пустой). Можно было бы написать:
#define NDEBUG l
Всякое вхождение в текст лексемы ndebug препроцессор заменил бы на "1".
#define может определять не только константы. Поскольку препроцессор выполняет просто текстовую подстановку, можно сопоставить символу и любую последовательность операторов:
#define SHUTDOWN \
printf ( "Error!") ; \
return -1
if (ErrorCondition О)
SHUTDOWN; // "Вызов" макроса.
Обратная дробная черта (\) означает, что макрос продолжается на следующей строчке.
Определенный ранее макрос можно аннулировать директивой #undef:
#undef NDEBUG
После этого макрос становится неопределенным, и последующие ссылки на него будут приводить к ошибке при компиляции.
Предопределенные макросы
Компилятор С автоматически определяет некоторые макросы. Их можно разбить на две категории: макросы ANSI и макросы, специфические для конкретного компилятора. Сводка предопределенных макросов ANSI дана в таблице.
Таблица 1 Предопределенные макросы ANSI
Макрос |
Описание |
__DATE__ |
Литеральная строка в формате "mmm dd yyyy". представляющая дату обработки данного файла препроцессором. |
__FILE__ |
Строка имени текущего файла (в кавычках). |
__LINE__ |
Целое, представляющее номер строки текущего файла. |
__STDC__ |
Равно 1, если установлена совместимость компилятора со стандартом ANSI (ключ -А командной строки). В противном случае макрос не определен. |
__TIME__ |
Строка в формате "hh:mm:ss", представляющее время препроцессорной обработки файла. |
Макросы с параметрами
Макросы могут выполнять не только простую текстовую подстановку. Возможно определение макросов с параметрами, напоминающих функции языка С, например:
#define PI 3.14159265
#define SQR(x) ((x)*(x))
#define AREA(x) (PI * SQR(x))
#define MAX(a,b) ((a)>(b) ? (a):(b))
...
circleArea = AREA(rl + r2);
cMax = MAX(i++, j++);
Третье макроопределение показывает, что макросы могут быть вложенными. После каждого расширения макроса препроцессор снова сканирует полученный текст на предмет того, не содержит ли он идентификаторов, в свою очередь являющихся макросами. Исключением являются случаи, когда расширение содержит собственное имя макроса или является препроцессорной директивой.
Директива #include
Препроцессор заменяет директиву содержимым указанного в ней файла. Есть две ее формы:
#include <filename>
finclude "filename"
В первом случае поиск нужного файла производится только в стандартных каталогах включаемых файлов; во втором случае — в текущем каталоге.