Использование директив #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 текст
где текст задает определенную инструкцию, возможно, имеющую аргументы. Прагмы различны для различных компиляторов, как правило, познакомиться с ними можно при изучении документации к системе программирования.
|
|
Псевдопеременными называют системные именованные константы, которые можно использовать в любом исходном файле на Си. Имена псевдопеременных начинаются и заканчиваются двумя символами подчеркивания (__). Как правило, определены следующие 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__ в файл дает одно и то же значение, независимо от того, как долго уже продолжается обработка.