Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Препроцессор языка Си и директивы условной компиляции






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

 

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.007 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал