Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Бочков C.. Язык программирования Си для персонального компьютера - royallib.ru.doc
Скачиваний:
40
Добавлен:
11.03.2016
Размер:
901.98 Кб
Скачать

Директивы #ifdef и #ifndef

Синтаксис:

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

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

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

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

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

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

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

Синтаксис:

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

Директива #line сообщает компилятору языка Си об изменении имени исходного файла и порядка нумерации строк. Это изменение отражается только на диагностических сообщениях компилятора: исходный файл будет теперь именоваться как <имя-файла >, а текущая компилируемая строка получит номер <константа >. После обработки очередной строки счетчик номеров строк увеличивается на единицу. В случае изменения номера строки и имени исходного файла директивой #line компилятор "забывает" их прежние значения и продолжает работу уже с новыми значениями.

Директива #line обычно используется автоматическими генераторами программ для того, чтобы диагностические сообщения относились не к исходному файлу, а к сгенерированной программе.

<Константа > в директиве #line может быть произвольной целой константой. <Имя-файла > может быть произвольной комбинацией символов, заключенной в двойные кавычки. Если имя файла опущено, то имя исходного файла остается прежним.

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

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

Примеры.

/* пример 1 */

#line 151 "copy.с"

/* пример 2 */

#define ASSERT(cond) if (!cond)\

{printf ("ошибка в строке %d файла %s\n", \

__LINE__, __FILE__);} else;

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

Во втором примере в макроопределении ASSERT используются псевдопеременные __LINE__ и __FILE__ для печати сообщения об ошибке, содержащего координаты исходного файла, если некоторое условие, заданное макроаргументом cond , ложно.