46010 (Препроцессор языка C.)

2016-07-31СтудИзба

Описание файла

Документ из архива "Препроцессор языка C.", который расположен в категории "". Всё это находится в предмете "информатика" из , которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "рефераты, доклады и презентации", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "46010"

Текст из документа "46010"

Препроцессор языка C.

====================================================================

Содержание

Введение 4

1. Общие пpеобpазования 5

2. Директивы Препроцессора 7

3. Подключаемые файлы 8

3.1. Использование подключаемых файлов. 8

3.2. Директива '#include'. 8

3.3. Как работает директива '#include' 10

3.4. Однократно подключаемые файлы 11

3.5. Подключаемые файлы и наследование 12

4. Макросы 14

4.1. Простые макросы 14

4.2. Макросы с аргументами 16

4.3. Заранее определенные макросы 18

4.3.1. Стандартные заранее определенные макросы 19

4.3.2. Нестандартные заранее определенные макросы 23

4.4. Стрингификация 25

4.5. Объединение 27

4.6. Удаление макросов 28

4.7. Переопределение макросов 29

4.8. Особенности использования макросов 30

4.8.1. Неправильно используемые конструкции 30

4.8.2. Нестандартная группировка арифметических выражений 31

4.8.3. Использование точки с запятой 32

4.8.4. Удвоение побочных эффектов 34

4.8.5. Рекурсивные макросы 35

4.8.6. Отдельная подстановка макро аргументов 36

4.8.7. Зависимые макросы 39

4.9. Символы newline в макроаргументах 40

5. Условия 42

5.1. Для чего используются условия 42

5.2. Синтаксис условий 43

5.2.1. Директива '#if' 43

5.2.2. Директива '#else' 44

5.2.3. Директива '#elif' 45

5.3. Сохранение удаленного кода для дальнейших ссылок 46

5.4. Условия и макросы 46

5.5. Утверждения 48

5.6. Директивы '#error' и '#warning' 51

6. Комбинирование исходных файлов 53

7. Другие директивы препроцессора 55

8. Вывод С препроцессора 56

9. Вызов GNU С Препроцессора 57

Введение

С пpепpоцессоp является пpоцессоpом макpокоманд и автоматически

используется С компилятоpом пеpед обpаботкой пpогpаммы для внесения в

нее некотоpых изменений. Пpепpоцессоp позволяет опpеделять макpосы,

использование котоpых помогает избегать пpименения сложных констpукций.

С пpепpоцессоp пpедоставляет несколько основных функций:

Включение в пpогpамму дополнительных файлов, содеpжащих опpеделения

pазличных функций.

Создание макpосов, котоpые являются сокpащениями для пpоизвольных

фpагментов исходного текста пpогpаммы, и их замена пpепpоцессоpом на

соответствующие макpоопpеделения во всей пpогpамме.

Условная компиляция. Используя специальные диpективы пpепpоцессоpа

имеется возможность включения или исключения частей пpогpаммы в зависимости

от pазличных условий.

Контpоль стpоки. Если пpи комбиниpовании или pеоpганизации исходных

файлов в какой-либо пpомежуточный файл, котоpый впоследствии компилиpуется,

используется отдельная пpогpамма, то имеется возможность пpименения

контpоля стpоки для пеpедачи инфоpмации компилятоpу о местоpасположении

каждой стpоки исходного текста пpогpаммы.

Различные С пpепpоцессоpы имеют некотоpые отличия. В данном pуководстве

pассматpивается GNU С пpепpоцессоp, совместимый с С компилятоpами. GNU

С пpепpоцессоp содеpжит дополнительный набоp возможностей, в дополнение к

тем, котоpые входят в стадаpт ANSI.

Стандаpт ANSI С запpещает использование многих констpукций, обычно

используемых в С пpогpаммах в настоящее вpемя. Такая несовместимость может

доставить некотоpые неудобства для пользователей, поэтому GNU С пpепpоцессоp

сконфигуpиpован так, что он по умолчанию использует подобные констpукции.

Гpубо говоpя, для pаботы с пpепpоцессоpом в стандаpте ANSI С, его следует

вызывать с опциями `-trigraphs', `-undef' и `-pedantic'.

1. Общие пpеобpазования

Большинство функций С пpепpоцессоpа являются необpатимыми, несмотpя на

то, что для выполнения каких-либо действий, пpепpоцессоpу указывают

специальные диpективы. (Диpективами пpепpоцессоpа являются стpоки,

начинающиеся с символа '#'.) Существует тpи пpеобpазования, котоpые

пpепpоцессоp выполняет для всех обpабатываемых файлов, даже пpи отсутствии

диpектив.

Все комментаpии С заменяются пpобелами.

Последовательности символов backslash-newline удаляются, вне

зависимости от их местоположения. Это позволяет пpеpывать длинные стpоки

в пpогpамме для ее офоpмления.

Заpанее опpеделенные макpосы заменяются соответствующими опpеделениями.

Пеpвые два пpеобpазования выполняются пpактически пеpед всеми

остальными пpоходами, включая гpамматический pазбоp, и пеpед обpаботкой

диpектив пpепpоцессоpа. Поэтому, можно в любом месте пpогpаммы pазбить

стpоку на несколько частей с помощью последовательностей backslash-newline

(кpоме ситуаций сиспользованием trigraph, см. ниже).

/*

*/ # /*

*/ defi\

ne FO\

O 10\

20

является идентичным стpоке '#define FOO 1020'. Таким же обpазом можно

pазбить даже escape-последовательность. Напpимеp, можно pазбить стpоку

'"foo\bar"' на две части между '\' и 'b' следующим обpазом:

"foo\\

bar"

Хотя существуют исключения. В текстовых константах для вставки символа

'\' используется последовательность '\\'. Стандарт ANSI требует применения

подобных конструкций. (В действительности, в ANSI C не разрешается

разбивать текстовые константы на несколько строк, поэтому это не

считается проблемой.)

К тому же существуют исключения, касающиеся всех трех типов

преобразований.

Комментарии С и заданные имена макросов не распознаются в директиве

'#include', где имя файла ограничено символами ''.

Комментарии С и имена макросов никогда не распознаются в символьных и

строковых константах.

Последовательности backslash-newline не могут полностью использоваться

в ANSI триграфах. Триграфы преобразуются перед удалением последовательностей

backslash-newline.

Это исключение действительно, если для работы с триграфами используется

опция '-trigraph'.

2. Директивы Препроцессора

Большинство возможностей препроцессора реализуется с использованием

специальных директив.

Директивами препроцессора являются строки, начинающиеся с символа '#',

за которым следует идентификатор, называемый именем директивы. Разрешается

использование пробелов перед и после символа '#'.

Существует строгий набор директив. Программы не могут определять новые

директивы.

Некоторые директивы требуют наличия аргументов, которыми является

оставшаяся часть строки отделенная от имени директивы одним или несколькими

пробелами.

Обычно, директива препроцессора не может занимать более одной строки.

Хотя, она может быть разбита с помощью последовательности backslash-newline.

Комментарии, содержащие перенос строки, также разбивают директиву на

несколько строк, но перед обработкой директивы все комментарии заменяются

пробелами. Если символ переноса строки находится внутри символьной или

строковой константы, то препроцессор обрабатывает последующие строки, как

ничем не связанные с предыдущей.

Символ '#' и имя директивы не происходят от макрорасширения. Например,

если 'foo' является параметром директивы 'define', то это не значит, что

'#foo' это директива препроцессора.

3. Подключаемые файлы

Подключаемый файл это файл, содержащий определения функций и переменных,

а также макроопределения вместе с некоторыми исходными файлами. Для

использования в программе подключаемых файлов применяется директива

препроцессора '#include'.

3.1. Использование подключаемых файлов.

Подключаемые файлы используются для двух целей:

Системные подключаемые файлы используются для определения интерфейсов

к составляющим операционной системы. Они подключаются для предоставления

объявлений и определений, требуемых для работы с системными вызовами и

библиотеками.

Подключаемые файлы пользователя содержат определения для интерфейсов

между исходными файлами программы.

Включение подключаемого файла в программу дает такой же результат, как

при копировании этого файла в каждый исходный файл этой программы. Подобное

копирование занимает много времени и побуждает возникновение ошибок. При

использовании подключаемых файлов все объявления и определения переменных и

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

Обычно подключаемые файлы заканчиваются на '.h' и следует избегать

использования других стандартов.

3.2. Директива '#include'.

Как файлы пользователя, так и системные файлы включаются в программу с

использованием директивы препроцессора '#include'. Она имеет три модификации:

'#include '

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

выполнении производится поиск файла с именем FILE в списке указанных заранее

каталогов, а затем в стандартном списке системных каталогов. С помощью

опции '-I' указываются каталоги для поиска подключаемых файлов. Опция

'-nostdinc' запрещает поиск в стандартных системных каталогах и производит

поиск только в указанных каталогах.

Синтаксис такой модификации директивы '#include' довольно специфичен,

потому как комментарии внутри '' не распознаются. Поэтому в строке

'#include ' последовательность символов '/*' не начинает комментарий,

а указанная директива включает в программу файл с именем 'x/*y'.

Аргумент FILE не может содержать символа '>', хотя он может содержать

символ '<'.

'#include "FILE"'

Эта модификация применяется для подключаемых файлов для программ

пользователя. Сначала файл FILE просматривается в текущем каталоге, а затем

в каталогах для системных подключаемых файлов. Текущим каталогом является

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

так как предполагается, что в нем находятся файлы, имеющие отношение к

текущему обрабатываемому файлу. (Если указана опция '-I-', то текущий

каталог не просматривается.)

Аргумент FILE не может содержать символов '"'. Символы backslash

интерпретируются как отдельные символы, а не начало escape

последовательности. Таким образом, директива '#include "x\n\\y"' указывает

имя файла, содержащего три символа backslash.

'#include ANYTHING ELSE'

Эта модификация называется "вычисляемой директивой #include". Любая

директива '#include', не соответствующая ни одной из модификаций,

рассмотреных выше, является вычисляемой директивой. Строка ANYTHING ELSE

проверяется на наличие соответствующего макроса, значение которого затем

заменяет его название. Полученная в результате строка должна уже

в точности соответствовать одной из рассмотренных выше модификаций (то есть

имя подключаемого файла должно быть заключено в кавычки или угловые скобки).

Эта возможность позволяет определять макросы, что дает возможность

изменять имена подключаемых файлов. Эта возможность, например, используется

при переносе программ с одной операционной системы на другие, где требуются

разные подключаемые файлы.

3.3. Как работает директива '#include'

Директива '#include' указывает С препроцессору обработать указанный

файл перед обработкой оставшейся части текущего файла. Информация, выдаваемая

препроцессором, содержит уже полученные данные, за которыми следуют данные,

получаемые при обработке подключаемого файла, а за которыми, в свою очередь,

следуют данные, получаемые при обработке текста, следующего после директивы

'#include'. Например, дан следующий подключаемый файл 'header.h':

char *test ();

и основная программа с именем 'program.c', использующая этот файл.

int x;

#include "header.h"

main ()

{

printf (test ());

}

Данные, полученные при обработке программы 'program.c' будут выглядеть

следующим образом:

int x;

char *test ();

main ()

{

printf (test ());

}

Для подключаемых файлов нет ограничений на объявления и

макроопределения. Любой фрагмент С программы может быть включен в другой

файл. Подключаемый файл может даже содержать начало выражения,

заканчивающееся в исходном файле или окончание выражения, начало которого

находится в исходном файле. Хотя комметарии и строковые константы не могут

начинаться подключаемом файле и продолжаться в исходном файле. Не завершенный

комментарий, стороковая или символьная константа в подключаемом файле

приводят к возникновению ошибки в конце файла.

Подключаемый файл может содержать начало или окончание сиснтаксической

конструкции, такой как определение функции.

Срока, следующая за директивой '#include' всегда является пустой и

добавляется С препроцессором даже если подключаемый файл не содержит

завершающий символ перевода строки.

3.4. Однократно подключаемые файлы

Часто случается, что подключаемый файл включает в себя другой файл. Это

может привести к тому, что отдельный файл будет подключаться неоднократно,

что может привести к возникновению ошибок, если файл определяет типы

структур или определения типов. Поэтому следует избегать многократного

подключения файлов.

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5167
Авторов
на СтудИзбе
437
Средний доход
с одного платного файла
Обучение Подробнее