Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PYaVU_s.doc
Скачиваний:
44
Добавлен:
24.02.2016
Размер:
665.09 Кб
Скачать
      1. Директивы #ifdef и #ifndef

Синтаксис:

#ifdef <identifier>

#ifndef <identifier>

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

Когда препроцессор обрабатывает директиву ifdef, то делается проверка идентификатора <identifier> на истинность (не нуль).

Директива #ifndef является отрицанием директивы #ifdef. Другими словами, если <identifier> не определен (или его определение отменено директивой #undef), то его значение истинно (не нуль). В противном случае значение ложно (нуль).

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

Синтаксис:

#line <constant>["filename"]

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

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

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

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

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

Примеры:

/*.....* example 1 *.....*/

#line 151 "copy.c"

/*..... example 2 *.....*/

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

{printf("assertion error line %d, file(%s)\n", \

__LINE, __FILE);}else;

В первом примере номер строки устанавливается равным 151 и имя файла изменяется на copy.c.

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

57