46010 (665317), страница 3

Файл №665317 46010 (Препроцессор языка C.) 3 страница46010 (665317) страница 32016-07-31СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 3)

'(x) - 1 / (x)').

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

Некоторые простые макросы являются заранее определенными. Их можно

применять без предварительного определения. Они разделяются на два класса:

стандартные макросы и системно-зависимые макросы.

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

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

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

функционирует GNU C. Их имена начинаются и заканчиваются двойным символом

подчеркивания. Все макросы в следующем списке до '__GNUC__' являются

стандартизированными ANSI C. Остальные макросы являются расширениями GNU C.

'__FILE__'

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

константы С. Возвращаемым именем является одно из указанных в директиве

'#include' или имя основного исходного файла.

'__LINE__'

Этот макрос заменяется на номер текущей строки в форме десятичной целой

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

значение меняется динамически.

Этот макрос и макрос '__FILE__' используются при генерировании сообщения

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

может содержать номер строки исходного файла где была обнаружена ошибка.

Например,

fprintf (stderr, "Internal error: "

"negative string length "

"%d at %s, line %d.",

length, __FILE__, __LINE__);

Директива '#include' изменяет значения макросов '__FILE__' и '__LINE__'

на соответствующие исходному файлу. В конце этого файла, если это был

подключаемый файл, значения '__FILE__' и '__LINE__' становятся теми, какими

они были до директивы '#include' (только значение '__LINE__' увеличивается

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

'#include').

Значения '__FILE__' и '__LINE__' изменяются при использовании директивы

'#line'.

'__DATE__'

Этот макрос заменяется на строчную константу, которая указывает дату

запуска препроцессора. Эта константа содержит одинадцать символов и

выглядит примерно так '"Jan 29 1987"' или '"Apr 1 1905"'.

'__TIME__'

Этот макрос заменяется на строковую константу, которая указывает время

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

примерно так: '"23:59:01:'.

'__STDC__'

Этот макрос заменяется на константу со значением 1 для указания, что

это С стандарта ANSI.

'__STDC_VERSION__'

Этот макрос заменяется на номер версии стандарта С, длинной целой

константой в форме 'YYYYMML', где YYYY и MM год и месяц выхода версии

стандарта. Это указывает на версию стандарта С, к которой относится

препроцессор.

'__GNUC__'

Этот макрос определен тогда и только тогда, когда используется GNU C.

Он определен только тогда используется полный GNU C компилятор. Если

вызвать препроцессор отдельно, то этот макрос будет не определен. Его

значение указывает на основной номер версии GNU CC ('1' для версии 1 GNU CC,

которая уже является устаревшей, и '2' для версии 2).

'__GNUC_MINOR__'

Этот макрос содержит дополнительный номер версии компилятора. Он может

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

компилятора.

'__GNUG__'

Компилятор GNU C определяет этот макрос если компилируемым языком

является С++.

'__cplusplus'

Стандарт ANSI для С++ раньше требовал определения этой переменной.

Хотя ее наличие больше не требуется, в GNU C++ она все еще определяется, как

и в других известных компиляторах С++. Этот макрос может быть использован

для определения каким компилятором был скомпилирован заголовок (С или С++).

'__STRICT_ANSI__'

Этот макрос определяется тогда и только тогда, когда при вызове GNU C

указывается опция '-ansi'. Он определяется как пустая строка.

'__BASE_FILE__'

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

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

при вызове компилятора С.

'__INCLUDE_LEVEL__'

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

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

единицу при обработке директивы '#include' и уменьшается на единицу при

завершении обработки каждого файла. Начальное значение для файлов,

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

'__VERSION__'

Этот макрос заменяется сторокой, указывающей номер версии GNU C.

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

Например '"2.6.0"'.

'__OPTIMIZE__'

Этот макрос определяется в оптимизирующих компиляторах. Если но

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

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

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

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

выполняться с таким же эффектом.

'__CHAR_UNSIGNED__'

Этот макрос определяется тогда и только тогда, когда тип данных 'char'

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

подключаемого файла 'limit.h'. Не следует использовать этот макрос. Вместо

этого можно использовать стандартные макросы, определенные в файле 'limit.h'.

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

добавлении знакового бита в больших восьмеричных символьных константах.

'__REGISTER_PREFIX__'

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

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

для написания ассемблерного кода, функционирующего в различных оболочках.

Например, в оболочке 'm68k-aout' производится замена на строку '""', а

в оболочке 'm68k-coff' макрос заменяется на строку '"%"'.

'__USER_LABEL_PREFIX__'

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

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

написания ассемблерного кода, функционирующего в различных оболочках.

Например, в оболочке 'm68k-out' он заменяется на строку '" "', а в оболочке

'm68k-coff' - на строку '""'.

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

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

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

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

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

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

командой 'cpp -dM'.

Некоторые нестандартные заранее определенные макросы более или менее

подробно описывают тип используемой операционной системы. Например,

'unix'

Этот макрос обычно определен на всех системах Unix.

'BSD'

Этот макрос определен на последних версиях системы Berkley Unix

(возможно только в версии 4.3).

Другие макросы описывают тип центрального процесора. Например,

'vax'

Определен на Vax компьютерах.

'mc68000'

Определен на большинстве компьютеров, использующих процессор Motorola

68000, 68010 или 68020.

'm68k'

Также определен на большинстве компьютеров с процессором 68000, 68010

или 68020. Хотя некоторые разработчики используют 'mc68000', а некоторые -

'm68k'. Некоторые заранее определяют оба макроса.

'M68020'

Определен на некоторых системах с процессором 68020 в дополнение к

макросам 'mc68000' и 'm68k', которые являются менее специфичными.

'_AM29K'

'_AM29000'

Определены на компьютерах с процессорами из семейства AMD 29000.

'ns32000'

Определен на компьютерах, использующих процессоры серии National

Semiconductor 32000.

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

систем. Например,

'sun'

Определен на всех моделях компьютеров Sun.

'pyr'

Определен на всех моделях компьютеров Pyramid.

'sequent'

Определен на всех моделях компьютеров Sequent.

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

они к тому же не соответствуют стандарту ANSI, потому что их имена не

начинаются с символа подчеркивания. Поэтому опция '-ansi' запрещает

определение этих символов.

Это приводит к тому, что опция '-ansi' становится бесполезной, так как

большое количество программ зависит от нестандартных заранее определенных

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

генерируют неправильные объявления в случае если требуемые имена не

определены. В результате очень мало программ компилируется с опцией '-ansi'.

Что же нужно сделать в ANSI C программе для того, чтобы проверить тип

используемого компьютера?

Для этой цели GNU C предоставляет параллельную серию символов, имена

которых состоят из обычных символов с добавлением строки '__' с начала и

с конца. Таким образом символ '__vax__' используется на системах Vax, и

так далее.

Набор нестандартных заранее определенных символов в GNU C препроцессоре

изменяется (при компиляции самого компилятора) с помощью макроса

'CPP_PREDEFINES', которым является строка, состоящая из опций '-D',

разделенных пробелами. Например, на системе Sun 3 используется следующее

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

#define CPP_PREDEFINES "-Dmc68000 -Dsun -Dunix -Dm68k"

Этот макрос обычно указывается в файле 'tm.h'.

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

"Стрингификация" означает преобразование фрагмента кода в строковую

константу, которая содержит текст этого фрагмента кода. Например, в результате

стрингификации 'foo (z)' получается '"foo (z)"'.

В С препроцессоре, стрингификация является опцией, используемой при

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

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

стрингификацию соответствующего аргумента при его подстановке в этом месте

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

макроопределения без его стрингификации, если перед именем аргумента нет

символа '#'.

Вот пример макроопределения с использованием стрингификации:

#define WARN_IF(EXP) \

do { if (EXP) \

fprintf (stderr, "Warning: " #EXP "\n"); } \

while (0)

Здесь аргумент 'EXP' заменяется один раз обычным образом (в конструкции

'if'), а другой - с использованием стрингификации (аргумет функции

'fprintf'). Конструкция 'do' и 'while (0)' является реализацией макроса

'WARN_IF (ARG);'.

Возможности срингификации ограничены до преобразования одного макро

аргумента в одну строковую константу: не существует методов комбинирования

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

Хотя рассмотренный выше пример показывает как может быть достигнут подобный

результат в стандартном ANSI C с использованием возможности объединения

смежных строковых констант в одну. Препроцессор стрингифицирует реальное

значение 'EXP' в отдельную строковую константу и в результате получается

следующий текст:

do { if (x == 0) \

fprintf (stderr, "Warning: " "x == 0" "\n"); } \

while (0)

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

за другом и объединяет их в одну:

do { if (x == 0) \

fprintf (stderr, "Warning: x == 0\n"); } \

while (0)

Стрингификация в С является не только заключением требуемого текста в

кавычки. Необходимо помещать символ backslash перед каждым дополнительным

символом кавычки, а также перед каждым символом backslash в символьной или

строковой константе для получения строковой константы в стандарте С. Поэтому

при стрингификации значения 'p = "foo\n";' в результате получится строка

'"p = \"foo\\n\";"'. Однако символы backslash, не принадлежащие символьной

или строковой константе, не дублируются: значение '\n' стрингифицируется в

'"\n"'.

Пробелы (включая комментарии), находящиеся в тексте, обрабатываются

в соответствии с установленными правилами. Все предшествующие и последующие

пробелы игнорируются. Любые последовательности пробелов в середине текста

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

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

"Объединение" означает соединение двух строковых констант в одну. При

работе с макросами, это означает объединение двух лексических единиц в одну

более длинную. Один аргумент макроса может быть объединен с другим аргументом

Характеристики

Тип файла
Документ
Размер
293,09 Kb
Тип материала
Учебное заведение
Неизвестно

Список файлов реферата

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