46010 (Препроцессор языка C.), страница 7

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

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

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

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

Текст 7 страницы из документа "46010"

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

Директива '#line' применяется в трех модификациях:

'#line LINENUM'

Здесь LINENUM это десятичная целая константа, указывающая, что следующая

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

'#line LINENUM FILENAME'

Здесь LINENUM это десятичная целая константа, а FILENAME - строковая

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

файла с именем FILENAME, а ее номер - LINENUM. Значение FILENAME должно

быть заключено в двойные кавычки.

'#line ANYTHING ELSE'

Значение ANYTHING ELSE проверяется на наличие макро вызовов, которые

затем подставляются. Результатом должна быть десятичная целая константа,

за которой может следовать стороковая константа, как это рассмотрено выше.

Директива '#line' изменяет значения заранее определенных макросов

'__FILE__' и '__LINE__'.

Вывод препроцессора (который затем перенапрвляется в компилятор)

содержит директивы, подобные '#line', только они начинаются с символа '#',

в отличие от '#line', за которыми следует номер строки и имя файла.

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

В этом разделе рассматриваются три дополнительные директивы. Они

описываются для полноты и не являются часто используемыми.

"Пустая директива" состоит из символа '#', за которым следует символ

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

комментарии). Пустая директива рассматривается как директива препроцессора и

не влияет на общий вывод. Основным значением этой директивы является то,

при обработке строки, содержащей символ '#', на вывод ничего не передается,

в отличие от выводимой строки, содержащей '#'.

Стандарт ANSI указывает, что директива '#pragma' имеет произвольное

значение, устанавливаемое при разработке. В препроцессоре GNU C она

не используется, за исключением значения '#pragma once'. Однако, она

остается при выводе препроцессора и может быть использована в процессе

компиляции.

Директива '#ident' используется для совместимости с некоторыми

системами. За ней следует строка с текстом. На некоторых системах этот

текст копируется в отдельное место объектного файла. Но в большинстве систем

он просто игнорируется и применение этой директивы не дает никакого эффекта.

В действительности, эта директива является единственной директивой,

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

которые ее поддерживают.

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

Вывод С препроцессора выглядит примерно так же, как и ввод, только

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

пробелами. Пробелы в середине строки не меняются. Однако пробел вставляется

после большинства макроподстановок.

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

следующей формы:

# LINENUM FILENAME FLAGS

которые вставляются в середину вводимого файла (но не в строчную или

символьную константу). Появление такой строки означает, что следующая

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

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

могут быть '1', '2', '3' или '4'. Если флагов более одного, то они

разделяются пробелами. Далее следует описание этих флагов.

'1'

Указывает на начало нового файла.

'2'

Указывает на возврат в файл (после включения другого файла).

'3'

Указывает на то, что следующий текст исходит из системного

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

предупреждающие сообщения.

'4'

Указывает на то, что следующий текст должен рассматриваться как С код.

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

Обычно нет необходимости вызывать С препроцессор отдельно: он вызывается

автоматически С компилятором. Однако иногда требуется запустить препроцессор

без компилятора.

С препроцессор запрашивает два имени файла в качестве аргументов. Один

из них является входным файлом, а другой - выходным. Препроцессор считыват

входной файл вместе с другими файлами, указанными директивой '#include'.

Получаемые при обработке данные поступают в выходной файл.

Как входным так и выходным файлами может быть параметр '-'. Если он

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

ввода, если же он указан вместо выходного файла, то все выходные данные

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

файла опущены, то для ввода и вывода вместо отсутствующих имен файлов

используется стандартный ввод и вывод.

Далее следует список опций, используемых С препроцессором. Эти опции

также могут быть указаны при компиляции программ, так как они автоматически

передаются препроцессору при вызове компилятора.

'-P'

Предотвращает генерацию строк, начинающихся с символа '#', вместе с

номером строки. Это может быть полезно при обработке препроцессором

какого-либо текста, не являющегося С программой.

'-C'

Не удаляет комментарии и передает их в выходной файл. Комментарии в

аргументах макросов поступают на вывод перед подстановкой макросов.

'-traditional'

Иммитирует работу более ранней версии препроцессора, что

противопоставляется стандарту ANSI C.

При макроподстановках игнорируется наличие символов двойной

и одинарной кавычки. Имя макроаргумента заменяется на его значение, даже

если он является строчной или символьной константой.

Значение макроса может завершаться в середине строковой или символьной

константы. Константа завершается в тексте программы после макроподстановки.

Конец строки завершает строковую или символьную константу без сообщения

об ошибке.

Комментарии заменяются пустым значением. (В ANSI C комментарии

заменяются пробелом.)

Не производится обработка чисел. Значение '1.0e+4' рассматривается как

три значения: '1.0e', '+' и '4'.

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

использование любого рекурсивно заданного макроса неизбежно приводит к

ошибке.

Символ '#' не имеет какого-либо специального значения в

макроопределении.

Текст программы, находящийся в конце значения макроса может выполняться

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

конструкцию, что невозможно в ANSI C.

Символ '\' в макроаргументе указывает на синтаксический смысл следующего

символа.

'-trigraphs'

Обработка последовательностей trigraph стандарта ANSI. Это

последовательности, состоящие из трех символов и начинающиеся со строки '??'.

Они определены стандартом ANSI C для обозначения отдельных символов.

Например, значением '??/' является '\', поэтому значением ''??/n'' будет

символьная константа, вкючающая символ перевода строки. GNU C препроцессор

не поддерживает все программы в стандарте ANSI C, пока не указана опция

'-trigraphs'.

'-pedantic'

Выдаются предупреждающие сообщения в соответствии со стандартом ANSI C,

например в случаях, если какой-либо другой текст кроме комментариев стоит

после директив '#else' или '#endif'.

'-pedantic-errors'

То же, что и '-pedantic', только выдаются сообщения об ошибках, вместо

предупреждений.

'-Wtrigraphs'

Выдается предупреждение, если обнаруживается trigraph

последовательность (предполагается, что указана опция '-trigraphs').

'-Wcomment'

Выдается предупреждение, если обнаруживается последовательность '/*'

внутри комментария.

'-Wall'

То же, что и '-Wtrigraphs' и '-Wcomment' (но не '-Wtraditional').

'-Wtraditional'

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

имеющие различия в обычном и в ANSI C.

'-I DIRECTORY'

Имя каталога DIRECTORY добавляется к началу списка каталогов, где

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

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

как эти каталоги просматриваются перед системными каталогами с подключаемыми

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

просматриваются слева направо, затем просматриваются системные каталоги.

'-I-'

Все каталоги, указанные опцией '-I' до указания опции '-I-'

просматриваются только при выполнении директивы '#include "FILE"' и не

используются директивой '#include '.

Если после опции '-I-' указаны дополнительные каталоги опцией '-I', то

эти каталоги используются всеми директивами '#include'.

При использовании опции '-I-', текущий каталог не просматривается в

первую очередь директивой '#include "FILE"'. Поэтому текущий каталог

просматривается только в случае его указания опцией '-I.'. Если указать обе

опции '-I-' и '-I.' то можно проследить, какие каталоги просматриваются до

текущего, а какие - после.

'-nostdinc'

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

файлов. Используются только каталоги, указанные опциями '-I' (а также

текущий каталог, если он указан).

'-nostdinc++'

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

а для поиска используются остальные стандартные каталоги. (Эта опция

применяется при построении библиотеки libg++.)

'-D NAME'

Определяется макрос с именем NAME и значением '1'.

'-D NAME=DEFINITION'

Определяется макрос с именем NAME и значением DEFINITION. Не существует

никаких ограничений на значение DEFINITION, но если препроцессор вызывается

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

синтаксис для предотвращения передачи символов со специальным значением,

таких как пробелы, оболочке. Если передается более чем один параметр '-D'

для одного и того же значения NAME, то используется значение, стоящее

правее всех.

'-U NAME'

Макрос с именем NAME не определяется. Если передаются оба параметра

'-U' и '-D' для одного имени, то макрос не определяется, так как приоритет

параметра '-U' выше.

'-undef'

Все нестандартные макросы не определяются.

'-A PREDICATE(ANSWER)'

Создается утверждение с именем PREDICATE и значением ANSWER.

Возможно использование опции '-A-' для предотвращения создания всех

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

используемой системы.

'-dM'

Вместо вывода результата обработки, выводится список директив '#define'

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

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

используемой версии препроцессора. Предполагая, что файл 'foo.h' не

существует, следующая команда

touch foo.h; cpp -dM foo.h

выявит значения всех заранее определенных макросов.

'-dD'

То же, что и '-dM' за исключением двух аспектов: заранее определенные

макросы не включаются и выводятся как все директивы '#define', так и

результат обработки. Весь вывод поступает в стандартный файл вывода.

'-M [-MG]'

Вмето вывода результата обработки, выводится информация в формате

команды 'make', описывающая зависимости основного исходного файла.

Препроцессор выводит информацию для 'make', которая включает в себя имя

объектного файла для данного исходного файла, запятую, и имена всех

подключаемых файлов. Если подключаемых файлов довольно большое количество,

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

'\'-newline.

Опция '-MG' указывает, что отсутствующие подключаемые файлы являются

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

с исходными файлами. Она должна быть указана вместе с опцией '-M'.

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

'-MM [-MG]'

То же, что и '-M', только используются файлы, указываемые директивой

'#include "FILE"'. Системные подключаемые файлы, указываемые директивой

'#include ', не используются.

'-MD FILE'

То же, что и '-M', только вся информация записывается в файл с именем

FILE. Используется в дополнение к стандартной компиляции файла. При указании

этой опции не запрещается стандартная компиляция в отличие от опции '-M'.

При вызове gcc аргумент FILE не указывается. Gcc создает файлы путем

замены ".c" на ".d" в конце имени исходного файла.

При использовании Mach возможно применение утилиты 'md' для объединения

нескольких файлов в один, который затем можно использовать с командой 'make'.

'-MMD FILE'

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