Препроцессор языка Си и директивы условной компиляции
Препроцессор языка Си – это программа, выполняющая обработку входных данных для другой программы. Препроцессор языка Си просматривает программу до компилятора, заменяет аббревиатуры в тексте программы на соответствующие директивы, отыскивает и подключает необходимые файлы, может влиять на условия компиляции. Директивы препроцессора не являются в действительности частью языка Си. Препроцессор включает в себя следующие директивы (табл.3.1)
Таблица 3.1
Директивы препроцессора языка Си
Определение | Назначение |
#define | Определение макроса |
#undef | Отмена определения макроса |
#include | Включение объекта-заголовка |
#if | Компиляция, если выражение истинно |
#ifdef | Компиляция, если макрос определен |
#ifndef | Компиляция, если макрос не определен |
#else | Компиляция, если выражение в if ложно |
#elif | Составная директива else/if |
#endif | Окончание группы компиляции по условию |
#line | Замена новым именем строки или имени исходного файла |
#error | Формирование ошибок трансляции |
#pragma | Действие определяется реализацией |
# | Null- директива |
Как видно из табл.3.1, все директивы начинаются с символа #.
Директива#define вводит макроопределение или макрос. Общая форма директивы следующая:
# define ИМЯ_МАКРОСА последовательность_символов
Последовательность символов называют еще строкой замещения. Когда препроцессор находит в исходном файле имя_макроса (просто макрос), он заменяет его на последовательность_символов.
Можно отменить определение макроса директивой # undef:
# undef имя_макроса
Данная строка удаляет любую ранее введенную строку замещения. Определение макроса теряется и имя_макроса становится неопределенным.
К примеру можно определить МАХ как величину 100:
#define MAX 100
Это значение будет подставляться каждый раз вместо макроса МАХ в исходном файле, Можно также использовать макрос вместо строковой константы:
#define NAME “ Turbo C++”
Если последовательность символов в директиве не помещается в одной строке, то можно поставить в конце строки \ и продолжить последовательность на другой строке. Среди программистов принято соглашение, что для имен макросов используются прописные буквы, так как их легко находить в программе. Также все директивы #define лучше помещать в начало программы.
Директива #define имеет еще одну важную особенность: макрос может иметь аргументы. Каждый раз, когда происходит замена, аргументы заменяются на те, которые встречаются в программе.
Пример: #define MIN(a, b) ((9a)<(b)) ? (a) : (b)
…………………………………………
printf(“Минимум из x и y “ % d, MIN(x ,y));
printf(“Минимум из a и b “ % d, MIN(n ,m));
…………………………………………………
Когда программа будет компилироваться, в выражение, определенное MIN (a, b) будут подставлены соответственно x и y или m и n. Аргументы a и b заключены в круглые скобки, так как вместо них может подставляться некоторое выражение, а не просто идентификатор.
Например, printf(“Минимум “ % d, MIN(x*x, x));
Директива # errorимеет вид:
# error сообщение_об_ошибке
Эта программа прекращает компиляцию программы и выдает сообщение об ошибке.
Директивы условной компиляции. К данным директивам относятся:
#if, #else, #elif, #endif.
Данные директивы производят выборочную компиляцию программы. Если выражение, следующее за #if, истинно, то коды, заключенные между #if и #endif, будут компилироваться. В противном случае они при компиляции будут пропущены. Выражение, следующее за #if, проверяется во время компиляции, поэтому оно может содержать только константы и макросы, которые прежде определены. Переменные здесь не могут использоваться.
Директива #else используется так же, как и else в языке Си.
Пример 3.9: Использование условной компиляции.
# include <stdio.h>
# define MAX 100
main(void)
{
# if MAX>99
printf(“ MAX равно %d \n”, MAX);
# endif
return 0;
}
Директива #elif используется для организации вложенной условной компиляции. Форма использования ее следующая:
#if <выражение>
последовательность операторов
#elif <выражение 1>
последовательность операторов
#elif <выражение 2>
последовательность операторов
…………………………………..
# endif
Другой метод условной компиляции состоит в использовании директив #ifdef и #ifndef. Основная форма использования этих директив следующая:
#ifdef ИМЯ_МАКРОСА
последовательность операторов
# endif
и соответственно
#ifndef ИМЯ_МАКРОСА
последовательность операторов
# endif
Если макрос определен, то при использовании # ifdef компилируется соответствующая последовательность до операторов # endif. Если же макрос не определен или был отменен директивой #undef, то соответствующая последовательность операторов игнорируется компилятором.
Директива #ifndef действует противоположным образом. О других директивах более подробно можно прочитать в [2].
Дата добавления: 2017-06-02; просмотров: 626;