Оцените презентацию от 1 до 5 баллов!
Тип файла:
ppt / pptx (powerpoint)
Всего слайдов:
20 слайдов
Для класса:
1,2,3,4,5,6,7,8,9,10,11
Размер файла:
67.25 kB
Просмотров:
100
Скачиваний:
0
Автор:
неизвестен
Слайды и текст к этой презентации:
№1 слайд![препроцессор языка си лекция](/documents_6/0805c2cdd99cada8de0a68734f9a984a/img0.jpg)
Содержание слайда: препроцессор языка си
лекция 25
№2 слайд![План лекции Препроцессор как](/documents_6/0805c2cdd99cada8de0a68734f9a984a/img1.jpg)
Содержание слайда: План лекции
Препроцессор как часть компилятора
Этапы работы и внутреннее устройство препроцессора
Язык препроцессора языка Си
Алгоритм работы препроцессора языка Си
Примеры
№3 слайд![Общие сведения о языке Си](/documents_6/0805c2cdd99cada8de0a68734f9a984a/img2.jpg)
Содержание слайда: Общие сведения о языке Си
Dennis Ritchie
Язык для разработки ОС UNIX
1969-1973, Bell Laboratories, США
Стандарты
ANSI (С89)
С99 – //, описание переменных не в начале блока, массивы переменной длины
С11 – параллелизм, полиморфизм
№4 слайд![Лексика языка Си Программа на](/documents_6/0805c2cdd99cada8de0a68734f9a984a/img3.jpg)
Содержание слайда: Лексика языка Си
Программа на Си -- одна или несколько единиц компиляции (файлов)
Стадии работы компилятора
Формирование лексем (в том числе работа препроцессора)
Синтаксический анализ
Семантический анализ
Оптимизация
Генерация кода
№5 слайд![Препроцессор языка Си](/documents_6/0805c2cdd99cada8de0a68734f9a984a/img4.jpg)
Содержание слайда: Препроцессор языка Си
Препроцессор – это интерпретатор специального языка преобразования текстов
Препроцессор языка Си – это часть компилятора, преобразующая содержимое единицы компиляции в последовательность лексем языка Си
Препроцессор GNU С -- библиотека
Этапы работы препроцессора языка Си
Замена триграфов
Склеивание строк
Удаление комментариев
Обработка директив
№6 слайд![Триграфы языка Си Триграфами](/documents_6/0805c2cdd99cada8de0a68734f9a984a/img5.jpg)
Содержание слайда: Триграфы языка Си
Триграфами языка Си называются следующие последовательности символов, начинающиеся с ??
№7 слайд![Пример ?? include lt stdio.h](/documents_6/0805c2cdd99cada8de0a68734f9a984a/img6.jpg)
Содержание слайда: Пример
??=include <stdio.h> /* # */
int main(void)
??< /* { */
char n??(5??); /* [ и ] */
n??(4??) = '0' - (??-0 ??' 1 ??! 2); /* ~, ^ и| */
printf("%c??/n", n??(4??)); /* ??/ = \ */
return 0;
??>
№8 слайд![Склеивание строк, удаление](/documents_6/0805c2cdd99cada8de0a68734f9a984a/img7.jpg)
Содержание слайда: Склеивание строк, удаление комментариев
Строка единицы компиляции, заканчивающаяся обратной наклонной чертой \, соединяется со следующей строкой
Символы единицы компиляции, образующие комментарий на языке Си, не включаются в выходную последовательность лексем языка Си
№9 слайд![Пример Будет ли исполнена](/documents_6/0805c2cdd99cada8de0a68734f9a984a/img8.jpg)
Содержание слайда: Пример
// Будет ли исполнена следующая строка????????????????/
a++;
??/ будет проинтерпретирован как '\' в конце строки и продлит комментарий на следующую строку
a++ будет воспринято как комментарий
№10 слайд![Директивы препроцессора Си](/documents_6/0805c2cdd99cada8de0a68734f9a984a/img9.jpg)
Содержание слайда: Директивы препроцессора Си
Директивы препроцессора языка Си записываются на специальном языке
Грамматика языка препроцессора языка Си отличается от грамматики языка Си
Строки единицы компиляции на языке препроцессора языка Си начинаются с символа #
Все остальные строки единицы компиляции являются входными данными для препроцессора языка Си
№11 слайд![Внутреннее устройство](/documents_6/0805c2cdd99cada8de0a68734f9a984a/img10.jpg)
Содержание слайда: Внутреннее устройство препроцессора
Вход -- последовательность байтов в строках единицы компиляции
Выход -- последовательность лексем для компилятора
Таблица макросов
Состояние препроцессора изменяемое директивами препроцессора
Идентификатор макроса и цепочка лексем «правая часть макроса», на которую препроцессор заменяет этот идентификатор в процессе раскрытия
Заполняется по ходу работы препроцессора в соответствии с директивами
№12 слайд![Константы, макросы, операции](/documents_6/0805c2cdd99cada8de0a68734f9a984a/img11.jpg)
Содержание слайда: Константы, макросы, операции
Константы
Целые числа, символы, строки
Записываются как соотв. константы в Си
Макросы
Записываются как идентификаторы в Си
Предопределенные макросы __FILE__, __LINE__, __FUNCTION__, __TIME__
Арифметические, побитовые, логические операции
Записываются как в языке Си
Проверка наличия определения макроса
defined имя_макроса
№13 слайд![Константные выражения](/documents_6/0805c2cdd99cada8de0a68734f9a984a/img12.jpg)
Содержание слайда: Константные выражения
Константным выражением языка препроцессора языка Си называется выражение, построенное по правилам языка Си из скобок ( и ) и констант, макросов и операций языка препроцессора языка Си
№14 слайд![Ключевые слова препроцессора](/documents_6/0805c2cdd99cada8de0a68734f9a984a/img13.jpg)
Содержание слайда: Ключевые слова препроцессора Си
define — определить макрос препроцессора
undef — отменить текущее определение макроса
include — вставить текст из указанного файла
if — передать строки до соотв. elif/else/endif на компиляцию, если выражение истинно
ifdef — то же, что if defined
ifndef — то же, что if !defined
else — передать строки до соотв. endif на компиляцию, если соотв. выражение ложно
elif — то же, что else if
endif — конец ветки условной компиляции
line — сообщить компилятору указанные номер строки и имя файла вместо фактических
error — завершить работу с ошибкой
pragma — добавить в выходной поток лексем лексемы, зависящие от компилятора
№15 слайд![Препроцессор Си Пока входной](/documents_6/0805c2cdd99cada8de0a68734f9a984a/img14.jpg)
Содержание слайда: Препроцессор Си
Пока входной поток байтов не пуст
С = строка, полученная заменой триграфов, склейкой строк и удалением комментариев
Если С начинается с #, то обработать директиву
Иначе для каждой лексемы Л в С
Если Л является макросом с определением Х, то положить во входной поток байтов "#undef Л <конец строки> Х #define Л Х <конец строки> "
Включает обработку параметров макроса – след. слайд
Иначе положить Л в выходной поток лексем
№16 слайд![Обработка директив define](/documents_6/0805c2cdd99cada8de0a68734f9a984a/img15.jpg)
Содержание слайда: Обработка директив
#define макрос [ ( парам [, парам …] ) ] правая часть
Добавить в таблицу макросов определение
#undef макрос
Удалить определение
#if константное выражение
текст 0
#else
текст 1
#endif
Добавить во входной поток байтов текст 0, если выражение истинно, или текст 1, если выражение ложно
#error сообщение
Завершить компиляцию с сообщением
№17 слайд![Обработка директив include lt](/documents_6/0805c2cdd99cada8de0a68734f9a984a/img16.jpg)
Содержание слайда: Обработка директив
#include < байты >
#include " байты "
Заменить #include на текст из файла с таким именем
Две формы отличаются набором директорий, в которых препроцессор ищет файл -- для < > дополнительно просматриваются директории с файлами заголовков, поставляемых вместе с ОС
#include последовательность лексем
Последовательность лексем должна раскрываться либо в < байты >, либо в " байты "
№18 слайд![Макросы с параметрами define](/documents_6/0805c2cdd99cada8de0a68734f9a984a/img17.jpg)
Содержание слайда: Макросы с параметрами
#define M(a,b,…) nextM
Добавить в таблицу макросов замену M(a,b,…) -> nextM
Если раскрываем M(A,B,…), то a, b, и т.д. в nextM будет заменено на A, В, и т.д.
a##b – объединить a и b в одну лексему
#a – строковая константа, значением которой является a
#define max(x,y) ((x)<(y)?(x):(y))
№19 слайд![Заключение Препроцессор как](/documents_6/0805c2cdd99cada8de0a68734f9a984a/img18.jpg)
Содержание слайда: Заключение
Препроцессор как часть компилятора
Этапы работы и внутреннее устройтсво препроцессора
Язык препроцессора языка Си
Алгоритм работы препроцессора языка Си
Примеры
№20 слайд![Препроцессор Си if if lt](/documents_6/0805c2cdd99cada8de0a68734f9a984a/img19.jpg)
Содержание слайда: Препроцессор Си
#if
#if <условие1>
<код1>
#elif <условие2>
<код2>
#else
<кодN>
#endif
Вычисляем условия по порядку
Когда получаем истину, помещаем во входной поток блок кода до следующей директивы
#elif и/или #else могут отсутствовать
Можно вложенные #if