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

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

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...

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



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

 

 

Сложные типы данных






Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...





© cyberpedia.su 2017-2020 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав

0.01 с.