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' - на строку '""'.


Информация о работе «Препроцессор языка C.»
Раздел: Информатика, программирование
Количество знаков с пробелами: 86051
Количество таблиц: 0
Количество изображений: 0

Похожие работы

Скачать
439386
0
0

... 1-12.   Напишите программу, печатающую гистограмму длин слов из файла ввода. Самое легкое - начертить гистограмму горизон- тально; вертикальная ориентация требует больших усилий. 1.7. Функции.   В языке “C” функции эквивалентны подпрограммам или функ- циям в фортране или процедурам в PL/1, паскале и т.д. Функ- ции дают удобный способ заключения некоторой части вычисле- ний в черный ...

Скачать
25582
0
0

... , сложны для понимания и абсолютно непрозрачны, а возможности существенно уступают Форту и Лиспу. В общем, муть и мрак. Вавилонское столпотворение Всякий раз, когда появляется очередной новый язык, о котором говорят, как об «окончательном и безальтернативном», предрекая скорую смерть всех остальных, мне становится смешно. Сам по себе язык в отрыве от среды программирования —малоинтересен, да и все ...

Скачать
668870
13
0

... программе. В данном разделе они перечислены в алфавитном порядке и приводятся с объяснениями. Эти ошибки могут являться следствием случайного затирание памяти программой. Abnormal program termination Аварийное завершение программы Данное сообщение может появляться, если для выполнения программы не может быть выделено достаточного количества памяти. Более подробно оно рассматривается в конце ...

Скачать
200759
5
11

... доступа с записью равной байту. Такие файлы называются двоичными. Файлы прямого доступа незаменимы при написании программ, которые должны работать с большими объемами информации, хранящимися на внешних устройствах. В основе обработке СУБД лежат файлы прямого доступа.  Кратко изложим основные положения работы с файлами прямого доступа. 1). Каждая запись в файле прямого доступа имеет свой номер ...

0 комментариев


Наверх