Директивы условного определения

Использование директив #ifdef и #ifndef эквивалентно применению директивы #if совместно с операцией defined(идентификатор). Эти директивы поддерживаются для совместимости с предыдущими версиями компиляторов Си. Синтаксис директив следующий:

#ifdef идентификатор

#ifndef идентификатор

При обработке #ifdef препроцессор проверяет, определен ли в данный момент идентификатор директивой #define. Если это так, условие считается истинным, иначе ложным.

Директива #ifndef противоположна по действию: если идентификатор не был определен директивой #define или его определение отменено директивой #undef, то условие считается истинным. В противном случае условие ложно.

Аналогично #if, за #ifdef и #ifndef может следовать набор директив #elif и/или директива #else. Набор должен быть завершен директивой #endif.

10.5. Управление нумерацией строк

Директива имеет следующий общий вид:

#line константа <"имя_файла">

Она сообщает компилятору об изменении имени исходного файла и порядка нумерации строк. Изменение отражается только на сообщениях компилятора, исходный файл будет теперь именоваться как "имя_файла", а текущая компилируемая строка получит номер "константа". После обработки очередной строки счетчик номеров строк увеличивается на единицу. В случае изменения номера строки и имени файла директивой #line компилятор продолжает работу с новыми значениями.

Директива используется, в основном, автоматическими генераторами программ. Константа может быть произвольным целым значением. Имя_файла может быть комбинацией символов, заключенной в двойные кавычки. Если имя файла опущено, оно остается прежним. Пример:

#line 1000 "file.сpp"

Здесь устанавливается имя исходного файла file.сpp и текущий номер строки 1000.

Текущий номер строки и имя исходного файла доступны в программе через псевдопеременные с именами __LINE__ и __FILE__. (см. п. 10.8). Они могут быть использованы для выдачи сообщений о местоположении ошибки во время исполнения программы.

10.6. Директива обработки ошибок

Директива имеет формат

#error текст

Чаще всего ее используют для обнаружения некоторой недопустимой ситуации. По директиве #error препроцессор прерывает компиляцию и выдает сообщение вида Fatal: имя_файланомер_строки Error directive: текст. Здесь имя_файла — имя исходного файла, номер_строки — текущий номер строки, текст —диагностическое сообщение. Пример:

#if (Boolean!= 0 && Boolean!=1)

#error Boolean имеет значение не 0 и не 1!

#endif

10.7. Указания компилятору Си

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

#pragma текст

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

10.8. Псевдопеременные

Псевдопеременными называют системные именованные константы, которые можно использовать в любом исходном файле на Си. Имена псевдопеременных начинаются и заканчиваются двумя символами подчеркивания (__). Как правило, определены следующие 4 псевдопеременные:

__LINE__ — десятичная константа, задает номер текущей обрабатываемой строки файла. Первая строка имеет номер 1.

__FILE__ — содержит имя компилируемого файла — символьную строку. Значение псевдопеременной изменяется каждый раз при обработке директивы #include или #line, а также по завершении включаемого файла. Значением __FILE__ является строка, представляющая имя исходного файла, заключенное в двойные кавычки. Поэтому для вывода имени файла не требуется заключать идентификатор __FILE__ в двойные кавычки.

__DATE__ — дата начала компиляции текущего файла, записанная как символьная строка. Каждое вхождение __DATE__ в заданный файл дает одно и то же значение, независимо от того, как долго уже продолжается компиляция. Дата хранится в формате mmm dd yyyy, где mmm — месяц (Jan, Feb и т. д.), dd — число месяца (от " 1" до "31"), yyyy — четырехзначный год (например, 2008).

__TIME__ — время начала компиляции текущего исходного файла, записанное как символьная строка в формате hh:mm:ss, где hh — час от 00 до 23, mm — минуты от 00 до 59, ss — секунды от 00 до 59.. Каждое вхождение __TIME__ в файл дает одно и то же значение, независимо от того, как долго уже продолжается обработка.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: