Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Препроцессор языка Си и директивы условной компиляции
Препроцессор языка Си – это программа, выполняющая обработку входных данных для другой программы. Препроцессор языка Си просматривает программу до компилятора, заменяет аббревиатуры в тексте программы на соответствующие директивы, отыскивает и подключает необходимые файлы, может влиять на условия компиляции. Директивы препроцессора не являются в действительности частью языка Си. Препроцессор включает в себя следующие директивы (табл.3.1)
Таблица 3.1 Директивы препроцессора языка Си
Как видно из табл.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].
|