Директивы условной компиляции

Директивы условной компиляции дают возможность выборочно компилировать части исходного кода программы. Этот процесс называется условной компиляцией.

Директива #if выглядит следующим образом:

#if константное_выражение

последовательность операторов программного кода

#endif

Если находящееся за директивой #if константное выражение истинно, то компилируется код, который находится между этим выражением и #endif, обозначающей конец блока #if. Константное выражение может быть задано через директиву #define. При этом если, например, задано число, не равное нулю, то такое константное выражение будет истинно; если же заданное число есть нуль, то константное выражение будет ложным. В частности, константное выражение может быть задано макросом с формальными параметрами, которые должны быть в свою очередь также константными параметрами.

Директива условной компиляции #else используется практически так же, как в обычном условном операторе языка С: ifelse. Дополнительная директива условной компиляции #else в общем случае имеет вид

#if константное_выражение

последовательность операторов программного кода

#else

альтернативная последовательность операторов программного кода

#endif

Аналогично используются директивы #elif (else if), которые в общем случае имеют следующий вид:

#if константное_выражение

последовательность операторов программного кода

#elif 2_ константное_выражение

2_ я_последовательность операторов программного кода

#elif 3_ константное_выражение

3_ я_последовательность операторов программного кода

НЕ нашли? Не то? Что вы ищете?

.

.

.

#elif N_ константное_выражение

N_ я_последовательность операторов программного кода

#else

альтернативная последовательность операторов программного кода

#endif

Если константное выражение в директиве #elif истинно (не нулевое, например), то будет компилироваться соответствующая последовательность операторов программного кода. При этом другие выражения в директивах #elif проверяться уже не будут, в том числе директива #else.

Особенностью рассмотренных конструкций является то, что проверка выражений осуществляется внутри директив #if и #endif.

В соответствии со стандартом С89 у директив #if и #elif может быть не менее 8 уровней вложенности. При вложенности каждая директива #endif, #else или #elif относится к ближайшей директиве #if или #elif . Каждая директива #if сопровождается директивой #endif.

Директива условной компиляции #ifdef в общем виде выглядит следующим образом:

#ifdef имя_макроса

последовательность операторов

#endif

Директива условной компиляции #ifdef означает «if defined» (если определено). Последовательность операторов будет компилироваться, если имя макроса было определено ранее с помощью директивы #define.

Директива условной компиляции #ifndef означает «if not defined» (если не определено), в общем виде выглядит следующим образом:

#ifndef имя_макроса

последовательность операторов

#endif

Последовательность операторов будет компилироваться, если имя макроса еще не определено директивой #define. В директивах #ifdef и #ifndef можно использовать #else или #elif. Согласно стандарту С89 допускается не менее 8 уровней #ifdef и #ifndef.

Директива #undef удаляет заданное определение имени макроса, т. е. «аннулирует» его определение; само имя макроса должно находиться после директивы. Используется в основном для того, чтобы локализовать имена макросов в тех участках кода, где они нужны. В общем случае эта директива выглядит следующим образом:

#undef имя_макроса

Для того чтобы узнать, определено ли имя макроса, можно использовать директиву #if в сочетании с оператором времени компиляции defined , который выглядит следующим образом:

defined имя_макроса

Если имя_макроса определено, то выражение считается истинным, в противном случае – ложным.

Единственная причина, по которой используется оператор defined, состоит в том, что с его помощью в #elif можно узнать, определено ли имя макроса.

Директива #line

Директива #line изменяет содержимое __LINE__ и __FILE__, которые являются зарезервированными идентификаторами (макросами) в компиляторе. В первом из них находится номер компилируемой в данный момент строки программного кода программы, а второй идентификатор – это строка, содержащая имя компилируемого исходного файла.

Директива #line выглядит следующим образом:

#line номер "имя_файла"

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

Директива #line в основном используется для отладки и специальных применений [3].

Предопределенные символические константы

В языке С определены пять встроенных, предопределенных имен макрокоманд (символических констант) (табл. 15.1). Они начинаются и заканчиваются двумя символами подчеркивания.

Таблица 15.1

Предопределенные символические константы

Символическая константа

Объяснение

__LINE__

Возвращает целую константу для номера текущей обрабатываемой строки исходного кода программы

__FILE__

По умолчанию возвращает в виде строки символов имя компилируемого исходного файла

__DATE__

Возвращает в виде строки символов дату (мм дд гг) начала компиляции текущего исходного файла

__TIME__

Возвращает в виде строки символов время (чч:мм:сс) начала компиляции текущего исходного файла

__STDC__

Возвращает целую константу 1, которая указывает на то, что данная реализация совместима со стандартом ANSI

Операторы препроцессора # и ##

Операторы # и ## применяются в сочетании с директивой #define, предусмотрены для работы препроцессора в некоторых особых случаях.

Оператор #, который обычно называют оператором превращения в строку (stringize), трансформирует аргумент, перед которым стоит, в строку, заключенную в кавычки. Должен использоваться в макросах с аргументами, поскольку операнд после # ссылается на аргумент макроса.

Оператор ##, называемый оператором склеивания (pasting), или конкатенации, конкатенирует две лексемы. Операция ## должна иметь два операнда .

Директива #pragma

Директива #pragma – это определяемая реализацией директива, которая позволяет передавать компилятору различные инструкции. Возможности этой директивы следует изучать по документации по компилятору.

Макрос подтверждения assert

Макрос assert, определенный в заголовочном файле assert.h, проверяет значение выражения. Если оно равно 0 (ложное), то assert распечатывает (например, выводит на консоль) сообщение об ошибке и вызывает функцию abort() (из библиотеки stdlib.h), завершающую работу программы. Например, в программе переменная х должна принимать значения, не превышающие 10. Для проверки и подтверждения такого условия в программу можно включить строку

assert( x <= 10 );

Если при выполнении данного макроса переменная х окажется больше 10, то выдается сообщение, содержащее номер строки и имя файла (например, main.c), в котором нарушено условие, а выполнение программы при этом прерывается. Формат выводимого сообщения зависит от конкретной реализации системы программирования. С помощью assert можно производить отладку программы во многих ее местах. Когда программа будет отлажена, то действие данного макроса можно устранить с помощью символической константы NDEBUG (not debugging – без отладки). Для этого перед заголовочным файлом assert.h следует вставить строку

#define NDEBUG

Пример 15. Написать программу с использованием макроса функции по определению числа, введенного пользователем, на предмет его простоты. Предусмотреть вывод на консоль времени компиляции программы и сообщения о реализации языка С.

Программный код решения примера:

#define _CRT_SECURE_NO_WARNINGS

#include <stdio. h>

#include <conio.h>

// Макрос с формальными параметрами

#define SIMPLE(x, d, b) for(d = 2; d < x; d++) \

if (!(x%d)) b = 0; \

if (b) puts("\n It is the simple number"); \

else puts("\n It is not the simple number");

int main (void) {

int b = 1, d = 0, x = 13;

printf("\n Enter the natural number: ");

scanf("%d", &x);

// Макрос с действительными параметрами

SIMPLE(x, d, b);

printf("\n %5sTime: %s\n Version C: %d \n", "", \

__TIME__, __STDC__);

printf("\n... Press any key: ");

_getch();

return 0;

}

В первой строке программы включена символическая константа для исключения вывода предупреждения относительно функции scanf() в среде MS Visual Studio 2010. В программе показано применение макроса функции с тремя формальными параметрами и несколькими строками программного кода.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

Основные порталы (построено редакторами)

Домашний очаг

ДомДачаСадоводствоДетиАктивность ребенкаИгрыКрасотаЖенщины(Беременность)СемьяХобби
Здоровье: • АнатомияБолезниВредные привычкиДиагностикаНародная медицинаПервая помощьПитаниеФармацевтика
История: СССРИстория РоссииРоссийская Империя
Окружающий мир: Животный мирДомашние животныеНасекомыеРастенияПриродаКатаклизмыКосмосКлиматСтихийные бедствия

Справочная информация

ДокументыЗаконыИзвещенияУтверждения документовДоговораЗапросы предложенийТехнические заданияПланы развитияДокументоведениеАналитикаМероприятияКонкурсыИтогиАдминистрации городовПриказыКонтрактыВыполнение работПротоколы рассмотрения заявокАукционыПроектыПротоколыБюджетные организации
МуниципалитетыРайоныОбразованияПрограммы
Отчеты: • по упоминаниямДокументная базаЦенные бумаги
Положения: • Финансовые документы
Постановления: • Рубрикатор по темамФинансыгорода Российской Федерациирегионыпо точным датам
Регламенты
Термины: • Научная терминологияФинансоваяЭкономическая
Время: • Даты2015 год2016 год
Документы в финансовой сферев инвестиционнойФинансовые документы - программы

Техника

АвиацияАвтоВычислительная техникаОборудование(Электрооборудование)РадиоТехнологии(Аудио-видео)(Компьютеры)

Общество

БезопасностьГражданские права и свободыИскусство(Музыка)Культура(Этика)Мировые именаПолитика(Геополитика)(Идеологические конфликты)ВластьЗаговоры и переворотыГражданская позицияМиграцияРелигии и верования(Конфессии)ХристианствоМифологияРазвлеченияМасс МедиаСпорт (Боевые искусства)ТранспортТуризм
Войны и конфликты: АрмияВоенная техникаЗвания и награды

Образование и наука

Наука: Контрольные работыНаучно-технический прогрессПедагогикаРабочие программыФакультетыМетодические рекомендацииШколаПрофессиональное образованиеМотивация учащихся
Предметы: БиологияГеографияГеологияИсторияЛитератураЛитературные жанрыЛитературные героиМатематикаМедицинаМузыкаПравоЖилищное правоЗемельное правоУголовное правоКодексыПсихология (Логика) • Русский языкСоциологияФизикаФилологияФилософияХимияЮриспруденция

Мир

Регионы: АзияАмерикаАфрикаЕвропаПрибалтикаЕвропейская политикаОкеанияГорода мира
Россия: • МоскваКавказ
Регионы РоссииПрограммы регионовЭкономика

Бизнес и финансы

Бизнес: • БанкиБогатство и благосостояниеКоррупция(Преступность)МаркетингМенеджментИнвестицииЦенные бумаги: • УправлениеОткрытые акционерные обществаПроектыДокументыЦенные бумаги - контрольЦенные бумаги - оценкиОблигацииДолгиВалютаНедвижимость(Аренда)ПрофессииРаботаТорговляУслугиФинансыСтрахованиеБюджетФинансовые услугиКредитыКомпанииГосударственные предприятияЭкономикаМакроэкономикаМикроэкономикаНалогиАудит
Промышленность: • МеталлургияНефтьСельское хозяйствоЭнергетика
СтроительствоАрхитектураИнтерьерПолы и перекрытияПроцесс строительстваСтроительные материалыТеплоизоляцияЭкстерьерОрганизация и управление производством