Вопрос 10
Подготовка программы к исполнению (схема, основные этапы, реализация для С++)
Подготовка программы к исполнению
1. Подготовка текста. До выполнения программы необходимо подготовить ее текст в файле с расширением.cpp. (используется текстовый редактор языка Си++).
2. Препроцессорная обработка текста программы.
Назначение препроцессора – обработка исходного текста программы до ее компиляции.
Препроцессорная обработка в соответствии с требованиями стандарта языка Си++ включает несколько стадий, выполняемых последовательно. Конкретная реализация транслятора может объединять несколько стадий, но результат должен быть таким, как если бы они выполнялись последовательно:
· все системно-зависимые обозначения (например, системно-зависимый индикатор конца строки) перекодируются в стандартные коды;
· каждая пара символов ‘\’ и «конец строки» убираются, и тем самым следующая строка исходного файла присоединяется к строке, в которой находилась эта пара символов;
· в тексте распознаются директивы препроцессора, а каждый комментарий заменяется одним символом пустого промежутка;
· выполняются директивы препроцессора и производятся макроподстановки;
· ESC-последовательности в символьных константах и символьных строках, например, ‘\n’ заменяются на их эквиваленты (на соответствующие числовые коды);
· смежные символьные строки конкатенируются, т.е. соединяются в одну строку.
Рассмотрим подробно стадию обработки директив препроцессора. При ее выполнении возможны следующие действия:
· замена идентификаторов (обозначений) заранее подготовленными последовательностями символов;
· включение в программу текстов из указанных файлов;
· исключение из программы отдельных частей ее текста (условная компиляция);
· макроподстановка, т.е. замена обозначения параметризованным текстом, формируемым препроцессором с учетом конкретных параметров (аргументов).
Для управления препроцессором, т.е. для задания нужных действий, используются команды (директивы) препроцессора, каждая из которых помещается на отдельной строке и начинается символом #.
Препроцессорные директивы:
#define, #include, #undef, #if, #ifdef, ifndef, #else, #endif, #elif, #line, #error, #pragma, #.
Директива #define.
Define идентификатор строка_замещения
Может размещаться в любом месте обрабатываемого текста, действие обычно распространяется от точки размещения до конца текста. В результате обработки все вхождения идентификатора, определенного командой #define, заменяется строкой замещения.
Если строка замещения оказалась слишком длинной, то ее можно продолжить в следующей строке текста программы, для этого в конце продолжаемой строки помещается символ ‘\’.
Замены в тексте можно отменять с помощью команды:
Undef идентификатор
Директиву #undef удобно использовать при разработке больших программ, когда они собираются из отдельных «кусков текста», написанных в разное время или разными программистами. В этом случае могут встретиться одинаковые обозначения разных объектов. Чтобы не изменять исходных файлов, включаемый текст можно «обрамлять» подходящими директивами #define – #undef и тем самым устранять возможные ошибки.
Директива #include.
include <имя_файла> // имя в угловых скобках